文章目录
(1)什么是Redis
Redis是一款内存高速缓存数据库。使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、list、set、zset、hash。
- redis是NOSQL (not only sql)型数据库意思就是非关系型数据库,标准的关系型数据库有mysql,sqlserver等等。关系型数据库是表结构的,而非关系型数据库是集合的结构。
(2)Redis的命令
【1】dump
语法:dump key
作用:将一个键值序列化
【2】restore
语法:restore key ttl serialized-value
说明:ttl是一个参数,可以是0或者其它值,如果是零则说明没有在序列化时将时间戳带入序列化,如果不为零,则ttl的值为该时间戳的值。
作用:将一个被dump的键值变得正常
【3】slaveof
语法:slaveof ip port
说明:在某些版本当中slaveof不能用,变为了replicaof
作用:改变一个从服务器的主服务器
【4】migrate
语法:<1>migrate ip host “key” destination-db timeout
<2>migrate ip host “” destination-db timeout keys key1…
说明:第一个是只传一个key的情况,第二个是多个
作用:给其它服务器传递键值对
【5】set
语法:set key value
作用:生成一个键值对
【6】moudle
语法:moudle load 绝对路径
作用:我认为有点类似linux中的挂起,也有点像文件包含,总的来说就是执行了这个命令之后就能调用脚本文件中的函数和方法了。
【7】eval “redis.breakpoint()” 0
说明:与开启单步调试之后搭配使用,表示程序有一个断点,后面的0代表的是附加参数。
(3)主从复制过程
【1】slaveof的用法
除了常规的使用slaveof+ip+port的用法还有就是”slaveof no one“,输入这个语句之后就说明该redis服务器不是任何服务器的从服务器。
【2】主从服务器间的三个阶段
{1}连接建立阶段
- 步骤1:保存主节点信息
该阶段的主要作用是在主从节点之间建立连接,为数据同步做好准备。
从节点服务器内部维护了两个字段,即masterhost和masterport字段,用于存储主节点的ip和port信息。需要注意的是,slaveof是异步命令,从节点完成主节点ip和port的保存后,向发送slaveof命令的客户端直接返回OK,实际的复制操作在这之后才开始进行。 - 步骤2:建立socket连接
建立socket连接从节点每秒1次调用复制定时函数replicationCron(),如果发现了有主节点可以连接,便会根据主节点的ip和port,创建socket连接。
从节点:为该socket建立一个专门处理复制工作的文件事件处理器,负责后续的复制工作,如接收RDB文件、接收命令传播等。
主节点:接收到从节点的socket连接后(即accept之后),为该socket创建相应的客户端状态,并将从节点看做是连接到主节点的一个客户端,后面的步骤会以从节点向主节点发送命令请求的形式来进行。 - 步骤3:发送ping命令
从节点成为主节点的客户端之后,发送ping命令进行首次请求,目的是:检查socket连接是否可用,以及主节点当前是否能够处理请求。
从节点发送ping命令后,可能出现3种情况:
(1)返回pong:说明socket连接正常,且主节点当前可以处理请求,复制过程继续。
(2)超时:一定时间后从节点仍未收到主节点的回复,说明socket连接不可用,则从节点断开socket连接,并重连。
(3)返回pong以外的结果:如果主节点返回其他结果,如正在处理超时运行的脚本,说明主节点当前无法处理命令,则从节点断开socket连接,并重连。 - 步骤4:身份验证
如果从节点中设置了masterauth选项,则从节点需要向主节点进行身份验证;没有设置该选项,则不需要验证。从节点进行身份验证是通过向主节点发送auth命令进行的,auth命令的参数即为配置文件中的masterauth的值。
如果主节点设置密码的状态,与从节点masterauth的状态一致(一致是指都存在,且密码相同,或者都不存在),则身份验证通过,复制过程继续;如果不一致,则从节点断开socket连接,并重连。 - 步骤5:发送从节点端口信息
身份验证之后,从节点会向主节点发送其监听的端口号(前述例子中为6380),主节点将该信息保存到该从节点对应的客户端的slave_listening_port字段中;该端口信息除了在主节点中执行info Replication时显示以外,没有其他作用。
{2}数据同步阶段
主从节点之间的连接建立以后,便可以开始进行数据同步,该阶段可以理解为从节点数据的初始化。具体执行的方式是:从节点向主节点发送psync命令(Redis2.8以前是sync命令),开始同步。
数据同步阶段是主从复制最核心的阶段,根据主从节点当前状态的不同,可以分为全量复制和部分复制,下面会有一章专门讲解这两种复制方式以及psync命令的执行过程,这里不再详述。
需要注意的是,在数据同步阶段之前,从节点是主节点的客户端,主节点不是从节点的客户端;而到了这一阶段及以后,主从节点互为客户端。原因在于:在此之前,主节点只需要响应从节点的请求即可,不需要主动发请求,而在数据同步阶段和后面的命令传播阶段,主节点需要主动向从节点发送请求(如推送缓冲区中的写命令),才能完成复制。
{3}命令传播阶段
数据同步阶段完成后,主从节点进入命令传播阶段;在这个阶段主节点将自己执行的写命令发送给从节点,从节点接收命令并执行,从而保证主从节点数据的一致性。
在命令传播阶段,除了发送写命令,主从节点还维持着心跳机制:PING和REPLCONF ACK。由于心跳机制的原理涉及部分复制,因此将在介绍了部分复制的相关内容后单独介绍该心跳机制。
【3】全量复制和部分复制
{1}全量复制
主服务器调用bgsave命令生成rdb文件传给从节点,以此来将主从服务器之间的数据状态相同,用全量复制的条件是,从节点判断无法进行部分复制,向主节点发送全量复制的请求;或从节点发送部分复制的请求,但主节点判断无法进行部分复制;具体判断过程需要在讲述了部分复制原理后再介绍。
{2}部分复制
部分复制和”数据偏移量“、”积压缓冲区“、”服务器运行id“来协助判断是否使用部分复制。本文不详细说明想了解更多可以自行百度。也可以看这一片文章深入学习redis(3):主从复制
(4)其它知识
【1】client维度
在redis中是有client维度的概念的,可以理解为程序专门将一个结构体中设置了一个元素,这个元素就是flags用来记录此时redis的运行状态。比如在LUA模式下就被标记为redis_LUA,在单步调试下就是redis_LUA_debug。这两个参数都是被宏定义的,且对应的十进制值相同。
【2】redis中的LUA模式
在改模式下可以运行自己写的脚本,而redis专门还出了一个调试模式,用来单步调试脚本。
【3】redis.conf文件中两个重要的参数
dir和dbfilename它们分别代表存储数据的文件应该在哪个目录下,和数据应该存到哪个文件中