redis小本本(四)

一、 redis中有两种事件:文件事件和时间事件。
文件事件指的是当客户端来了一条请求之后,服务端对其进行处理的事件。
时间事件指的是定时运行的一些redis命令,可能是固定时间运行一次的时间事件,也可能是周期性的时间事件。
(1)文件事件
1. redis服务端处于监听状态,当有客户端要连接时,调用连接应答处理器进行应答。
2. 客户端向服务端发送命令时,服务端调用命令请求处理器,之后传给相关程序进行处理。
3. 将请求处理之后,服务端调用命令回复处理器将回复发回给客户端。
(2) 时间事件
redis使用一个时间链表将所有的时间事件放在一起,以头插法插入,这个链表的ID为逆序,过期时间没有顺序。
每个节点有以下三个部分:
ID:按插入顺序递增
when:过期时间,是一个时间戳
timeproc:时间事件处理器,当时间到期时,运行的处理内容函数
每次遍历这个事件链表,将时间到达的事件进行相应处理,并更改此节点的到期时间(如果是定时事件,将其删除,如果是周期事件,将过期时间更新为加上过期秒数)
(3) 在处理事件的过程中,不会出现抢占的情况,如果在即将到达时间事件的节点来了一个文件事件,先处理文件事件,当文件事件处理结束后,可能时间事件已经超时,这时候处理时间事件,所以时间事件可能比设定的时间要晚一点。

二、 redis客户端请求时,服务端执行过程:
(1)客户端传过来的命令是使用redis protocol传输的,传到服务端之后,由服务端将命令进行整合,即装进命令表中,命令表中有一系列的命令,每个命令后面挂着一个redisCommand结构体,每个redisCommand结构体中存放一个redis命令。
(2)执行预备操作:判断客户端是否有执行权限,redis内存是否足够,是否正在执行其他事务,是否有watch命令监控着此键值对等等。
(3)调用命令的实现函数执行客户端命令。
(4)执行后续操作:包括在AOF文件追加操作指令等。
(5)将命令结果发送回给客户。

三、 主从复制
主从服务器的复制过程如下所示:
(1)从服务器发送命令给主服务器说“我要成为你的slave,你当我的master好不好”,即命令SLAVEOF <master_ip> <master_port>
(2)主服务器说“好呀好呀”,然后将从服务器的ip和端口记在自己的redisServer结构体中,然后说“从今天起,有我一口吃的就有你的一口,爷罩着你”
(3)它俩建立套接字连接关系
(4)从服务器给主服务器发送ping命令说“爷,我说话你能听见吗”,主服务器返回说“能听见放心吧,有事喊一声”
(5)主从服务器连接建立好之后,从服务器给主服务器发送PSYNC命令,要求同步服务器信息,跟主服务器说“爷,你看你有啥资源,也分享给我呗”
(6)主服务器实现完整重同步操作,即使用SAVE命令生成一个RDB文件,并将此RDB文件发送给从服务器
(7)每次主服务器收到客户端的命令之后,都会发送给从服务器一份,同时缓存到复制积压缓冲区中一份,存到缓冲区是为了防止命令丢失,可以重新发送。
(8)从服务器每秒钟向主服务器发起REPLCONF ACK请求进行心跳检测“爷,小的在呢,我的复制偏移量为**,您看跟您的复制偏移量是否相同”
(9)主从服务器中都存在一个复制偏移量,记录当前数据同步到哪一步了,正常情况下主从服务器的复制偏移量是相同的,如果不同,则说明两者之间的连接断开了,或者其中的某些同步命令丢失了。这种情况下,从服务器给主服务器发送心跳检测之后,主服务器发现发过来的复制偏移量和自己的复制偏移量并不相同,就去查找复制积压缓冲区,找到从服务器的复制偏移量,并将其之后的命令都同步给从服务器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值