redis 初识

Redis是什么?

Redis是一个以键值对形式存储的NoSql数据库,它的所有数据都存储在内存中,并且可以将内存中的数据持久化到磁盘上。它可以用作数据库、缓存系统和消息代理等。它支持5种数据结构String、List、Hash、Set、Sort Set。并且内置了主从复制功能、Lua脚本、事务和不同级别的持久化,另外还提供了通过Redis Sentinel实现的Redis高可用,还有Redis 集群自动分区等实现。

它是怎么工作的?

Redis服务器可以与多个客户端建立网络连接,它处理客户端发送的命令请求,然后在数据库中保存执行命令所产生的数据,并通过资源管理器维持着服务器自身的运行。

从启动到接受命令,Redis服务器都做了些什么操作?

Redis服务器从启动到能够接受客户端发送的命令请求,需要一些列的初始化和设置,比如初始化服务器状态、加载用户配置、创建相应的数据结构和网络连接等。

1)初始化服务器的状态结构

主要设置服务器的运行ID、默认配置文件路径、运行架构(是否集群)、默认端口号、RDB和AOF的持久化条件、LRU时钟、创建命令表等。

2)加载用户配置

在启动服务器时,用户可以通过指定配置参数或配置文件来改变服务器的默认配置。

3)初始化服务器的数据结构

如创建与客户端相关的状态链表、创建包含所有数据库的数组(默认redis服务器有16个数据库)、与订阅频道相关的数据结构等,在启动时服务器会为这些数据结构分配相应的内存。在创建好这些数据结构外,Redis服务器还会做一些重要的设置:为服务器设置进程信号、创建共享对象、打开监听端口等等。

在完成以上初始化后,服务器还需要加载RDB文件或AOF文件,并根据这些文件的内容来还原服务器的数据库状态。

它是怎么执行命令的?

执行命令的过程如下:

1):客户端向服务器端发送命令请求set key value。

2):服务器接收并处理客户端发来的命令请求,在数据库中做相关设置操作,并产生命令回复"OK"。

3):服务器将命令回复发送给客户端。

4):客户端接收服务器返回的命令恢复,并把回复内容打印给用户。

对于步骤1,在客户端将命令请求发送给服务器前,会将这个命令请求转换成协议格式,并通过与服务器建立Socket连接,才将转换成协议后的命令请求发送给服务器。

对于步骤2,服务器接收到命令请求后,读取Socket中的命令请求,并将其保存到缓冲区里,然后服务器对缓冲区里面的命令请求进行解析,提取出命令请求中包含的命令参数和参数个数,并保存到一个与客户端相关的数据结构中。然后调用命令执行器,执行命令。

但是在执行命令前,还要做一些相关的准备:检查命令是否存在命令表中,以及检查命令的参数和参数个数是否匹配,另外还有身份验证、内存的使用情况、客户端使用的是否为订阅模式、客户端是否使用了事务、是否启动了监视器等等。只有在这些检查都通过了,才能调用命令的实现函数,真正开始处理命令请求,命令实现函数负责执行命令指定的操作,并产生相应的命令回复,这些回复会被保存到与客户端相关联的缓冲区里,然会实现函数还会为客户端的套接字关联命令回复处理器,这个处理器负责把命令回复发送给客户端。

执行完实现函数后,还需做一些后续工作:

a)检查是否开启了慢查询日志功能,如果是,将会为该命令添加一条新的慢查询日志。

b)检查是否开启了AOF持久化功能,如果是,将会把该命令添加到AOF的缓冲区里面。

c)检查是否其它的从服务器正在复制该服务器,如果有,就会把该命令发送给所有的从服务器。

至此,服务器对该命令执行完毕,就可以继续从缓冲区里取出下一条命令来处理执行了。

对于步骤3:前面提到的,由命令实现函数为客户端的Socket关联命令回复处理器,当客户端的Socket变得可写时,命令回复处理器将会把保存在与客户端相关联的缓冲区里的命令回复发送个客户端。当发送完毕后,命令回复处理会清空与客户端关联的缓冲区,为处理下一个命令请求做准备。

对于步骤4,当客户端接收到命令回复后,会将这些回复转换为可读的格式,打印给用户看。

那么它是怎么维持自身的运行的呢?

Redis服务器默认每隔100ms调用一次serverCron函数,这个函数负责管理服务器的资源,来维持服务器自身的运转。

负责管理的资源都有:管理服务器的内存使用情况、管理客户端的资源(连接状态)、管理数据库的资源(删除过期的键、对数据压缩等)、检查AOF运行状态以及将AOF缓冲区里的数据写到AOF文件中等。

和其它类型的数据库区别?

和关系型数据库的区别

对于关系型数据库(oracle、mysql)通常需要写Sql脚本来查询多个表之间关联的数据,数据是完全结构化存储的,并且是存储在磁盘上的,另外还支持事务、索引等,但在Redis中并没有这些概念,它的数据是以键值对的形式存储的,不支持关联查询,数据是非结构化的,并且数据是完全存储在内存中的,它也支持事务,但事务的级别比较低,不能创建索引。但是Redis查询速度是关系型数据库没法比的,因为它的数据总是在内存中,不需要对查询语句的解析和优化,并且Redis查询数据不会产生不必要的临时数据,这样就避免了扫描过后还得要再删除这些临时数据,最终提高了查询性能。

和Memcached的区别

Memcached和Redis很相似,数据都是存储在内存中,同样也是以键值对的形式存储数据的,但它只有一种数据存储结构(只能以字符串的形式存储数据),而Redis除了这一种还有List、Hash、Set、SortSet四种,最大的不同是Redis可以把数据持久化到磁盘上,并支持数据的主从复制。相对Memcached,Redis能够解决更广泛的问题。

为什么要用它?

Redis作为内存数据库,查询速度快、并发量高,但缺点是数据类型少、关联查询不方便、不能存储海量的数据,一般用作缓存系统、消息代理等,通常作为辅助数据库和其他的存储系统配合使用,到底要不要选择用Redis,根据自己应用的需求、应用场景来抉择。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章