参考:<<Redis设计与实现>>
- 注:这本书是基于Redis3.0版本写的,和后面的版本有点差异
通过执行MONITOR
命令,客户端成为监视器,实时接收打印服务器当前处理的命令请求的相关信息:
redis> monitor
OK
1567484928.445895 [0 127.0.0.1:62633] "COMMAND"
1567485005.667396 [0 127.0.0.1:62633] "set" "num" "1"
1567485008.035712 [0 127.0.0.1:62633] "get" "num"
1567485054.970072 [0 127.0.0.1:62702] "COMMAND"
1567485058.398922 [0 127.0.0.1:62702] "get" "num"
每当客户端向服务器发送一条命令请求时,服务器处理完这条命令请求,还会把这条命令请求的信息发送给所有监视器,如下图所示:
一、成为监视器
发送MONITOR命令后,这个客户端就变成了一个监视器。实现原理:
- 打开客户端的REDIS_MONITOR标志
- 客户端被添加到redisServer的monitors链表的尾部
示例:
假设之前monitors链表已经有c128、c256、c512三个客户端,客户端c10086发送MONITOR命令,此时monitors链表如下图所示:
二、向监视器发送命令信息
服务器在每次处理命令前,都会调用replicationFeedMonitors函数,由这个函数将被处理器的命令请求的相关信息发送给各监视器,流程如下:
- 根据命令请求创建发送给各监视器的信息
- 服务器遍历monitors链表,将信息发送各客户端
示例:
服务器在时间1567485008.035712,IP 127.0.0.1、端口号62633的客户端发送的命令请求,对0号数据库执行命令get num
,那么服务器将会创建以下信息:1567485008.035712 [0 127.0.0.1:62633] "get" "num"
如果服务器monitors链表中有c128、c256、c512三个客户端,那么服务器会分别将信息发送给这三个监视器,如下图所示: