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"

每当客户端向服务器发送一条命令请求时,服务器处理完这条命令请求,还会把这条命令请求的信息发送给所有监视器,如下图所示:
Redis学习笔记 - 监视器_第1张图片

一、成为监视器

发送MONITOR命令后,这个客户端就变成了一个监视器。实现原理:

  • 打开客户端的REDIS_MONITOR标志
  • 客户端被添加到redisServer的monitors链表的尾部

示例:

假设之前monitors链表已经有c128、c256、c512三个客户端,客户端c10086发送MONITOR命令,此时monitors链表如下图所示:
Redis学习笔记 - 监视器_第2张图片

二、向监视器发送命令信息

服务器在每次处理命令前,都会调用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三个客户端,那么服务器会分别将信息发送给这三个监视器,如下图所示:
Redis学习笔记 - 监视器_第3张图片

你可能感兴趣的:(redis)