欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis(源码剖析):78---监视器(MONITOR命令、replicationFeedMonitors函数)

程序员文章站 2022-05-20 10:57:08
...

一、监视器介绍

  • 通过执行MONITOR命令,客户端可以将自己变为一个监视器,实时地接收并打印出服务器当前处理的命令请求的相关信息:

Redis(源码剖析):78---监视器(MONITOR命令、replicationFeedMonitors函数)

  • 每当一个客户端向服务器发送一条命令请求时,服务器除了会处理这条命令请求之外, 还会将关于这条命令请求的信息发送给所有监视器,如下图所示:

Redis(源码剖析):78---监视器(MONITOR命令、replicationFeedMonitors函数)

二、成为监视器(MONITOR命令、REDIS_MONITOR标志)

  • 发送MONITOR命令可以让一个普通客户端变为一个监视器
  • MONITOR命令的实现原理可以用 以下伪代码来实现:
def MONITOR():
    # 打开客户端的监视器标志
    client.flags |= REDIS_MONITOR
    # 将客户端添加到服务器状态的monitors 链表的末尾
    server.monitors.append(client)
    # 向客户端返回OK
    send_reply("OK")
  • 举个例子,如果客户端c10086向服务器发送MONITOR命令,那么这个客户端的REDIS_MONITOR标志会被打开,并且这个客户端本身会被添加到monitors链表的表尾
  • 假设客户端c10086发送MONITOR命令之前,monitors链表的状态如下面左图所示,那么在服务器执行客户端c10086发送的MONITOR命令之后,monitors链表将被更新为下面右图所示的状态:

Redis(源码剖析):78---监视器(MONITOR命令、replicationFeedMonitors函数)Redis(源码剖析):78---监视器(MONITOR命令、replicationFeedMonitors函数)

三、向监视器发送命令信息(replicationFeedMonitors()函数)

  • 服务器在每次处理命令请求之前,都会调用replicationFeedMonitors函数,由这个函数将被处理的命令请求的相关信息发送给各个监视器
  • 以下是replicationFeedMonitors函数的伪代码定义,函数首先根据传入的参数创建信息, 然后将信息发送给所有监视器:
def replicationFeedMonitors(client, monitors, dbid, argv, argc):
    # 根据执行命令的客户端、当前数据库的号码、命令参数、命令参数个数等参数
    # 创建要发送给各个监视器的信息
    msg = create_message(client, dbid, argv, argc)
    # 遍历所有监视器
    for monitor in monitors:
        # 将信息发送给监视器
        send_message(monitor, msg)
  • 举个例子,假设服务器在时间1378822257.329412,根据IP为127.0.0.1、端口号为56604 的客户端发送的命令请求,对0号数据库执行命令KEYS*,那么服务器将创建以下信息:

Redis(源码剖析):78---监视器(MONITOR命令、replicationFeedMonitors函数)

Redis(源码剖析):78---监视器(MONITOR命令、replicationFeedMonitors函数)

  • 如果服务器monitors链表的当前状态如上图所示,那么服务器会分别将信息发送给c128、c256、c512和c10086四个监视器,如下图所示

Redis(源码剖析):78---监视器(MONITOR命令、replicationFeedMonitors函数)

相关标签: Redis(源码剖析)