12. 監(jiān)視器
? 在上一章《3.11 鍵通知》我們講了Redis的Key發(fā)生變化的時候會產(chǎn)生鍵通知,并且通過pub/sub機制來讓訂閱的客戶端知曉鍵通知衡蚂。那么如果我想知道這個Redis接收的所有命令要怎么辦呢?答案就是:監(jiān)視器兵怯。
? Redis的監(jiān)視機制可以讓某個客戶端變成一個監(jiān)視器,實時打印出被監(jiān)視服務(wù)器的命令請求。
? 使用發(fā)放也極其簡單径玖,客戶端向服務(wù)器發(fā)送一個 MONITOR 命令即可實現(xiàn)對這個服務(wù)器的監(jiān)控。
? MONITOR 實現(xiàn)原理比較簡單颤介,就是改變客戶端的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);
}
? 當(dāng)Redis服務(wù)器執(zhí)行完命令之后滚朵,會向server.monitors鏈表中的所有客戶端發(fā)送相關(guān)通知冤灾。用偽代碼表示:
def call(command, server):
# 執(zhí)行正常命令
exec_command(command)
# 如果server.monitors鏈表不為零,那么就發(fā)送命令給server.monitors鏈表中的所有客戶端
if len(server.monitors) > 0:
send_msg(command, server.monitors)