12. 监视器
在上一章《3.11 键通知》我们讲了Redis的Key发生变化的时候会产生键通知,并且通过pub/sub机制来让订阅的客户端知晓键通知。那么如果我想知道这个Redis接收的所有命令要怎么办呢?答案就是:监视器。
Redis的监视机制可以让某个客户端变成一个监视器,实时打印出被监视服务器的命令请求。
使用发放也极其简单,客户端向服务器发送一个 MONITOR 命令即可实现对这个服务器的监控。
MONITOR 实现原理比较简单,就是改变客户端的flags,然后在server.monitors链表中加入这个客户端即可,我们一起来看下源码:
void monitorCommand(redisClient *c) {
/* ignore MONITOR if already slave or in monitor mode */
if (c->flags & REDIS_SLAVE) return;
c->flags |= (REDIS_SLAVE|REDIS_MONITOR);
listAddNodeTail(server.monitors,c);
addReply(c,shared.ok);
}
当Redis服务器执行完命令之后,会向server.monitors链表中的所有客户端发送相关通知。用伪代码表示:
def call(command, server):
# 执行正常命令
exec_command(command)
# 如果server.monitors链表不为零,那么就发送命令给server.monitors链表中的所有客户端
if len(server.monitors) > 0:
send_msg(command, server.monitors)