Redis 监视器

摘要:
此客户端的REDIS _ MONITOR徽标将打开。命令参数和编号*/listNode*ln;空);(长)tv.tv _ usec)//发送到监视器的信息应包括客户端、服务器的IP地址。unixsocket);(长)argv[j]->ptr);(char*)argv[j]->

一  介绍

客户端可以通过执行MONITOR命令,将客户端转换成监视器,接收并打印服务器处理的每个命令请求的相关信息。

Redis 监视器第1张

当一个客户端从普通客户端变为监视器时,该客户端的REDIS_MONITOR标识会被打开。
服务器将所有监视器都记录在monitors链表中。
每次处理命令请求时,服务器都会遍历monitors链表,将相关信息发送给监视器。

当前客户端变身监视器,将服务器当前处理的命令都打印出来。
除了命令与参数外,还有精确到微妙的时间戳,选择的数据库,客户端的ip,port。
192.168.1.3:6379> monitor
OK
1464487722.534521 [0 10.249.88.69:33846] "get" "fwy"
1464487728.486523 [0 10.249.88.69:33846] "set" "fwy" "b"
1464488225.302544 [0 10.249.88.69:45389] "select" "3;"
1464488230.006471 [0 10.249.88.69:45389] "select" "3"
1464488232.342483 [3 10.249.88.69:45389] "set" "fwy" "a"

二  数据结构

redisServer的slave链表,保存着各个监视器,新来的监视器,会加到链表尾。
struct redisServer {
    ...
    list *slaves, *monitors;    /* List of slaves and MONITORs */
    ...
}

三  算法

服务器处理客户端发来的命令请求,还会把命令信息发给各个监视器。

服务器主要是通过replicationFeedMonitors(),来将各个命令信息发给监视器们。
replication.c/replicationFeedMonitors()
void replicationFeedMonitors(redisClient *c, list *monitors, int dictid, robj **argv, int argc) {
    /*1.根据命令与参数构造发送给监视器的字符串对象;
      2.遍历各个监视器,把字符串对象发出。
      参数:客户端状态,监视器链表,客户端的dbnum,命令参数与个数
     */
    listNode *ln;
    listIter li;
    int j;
    sds cmdrepr = sdsnew("+");
    robj *cmdobj;
    struct timeval tv;

    gettimeofday(&tv,NULL);

    // 创建要发给各个监视器的信息
    cmdrepr = sdscatprintf(cmdrepr,"%ld.%06ld ",(long)tv.tv_sec,(long)tv.tv_usec);

    // 发送给监视器的信息要包含该客户端的ip,port,但如果是lua脚本客户端与unixsocket客户端,就没有port了,但也需要打印它们的信息,比如来自于哪个unixsocket
    if (c->flags & REDIS_LUA_CLIENT) {
        cmdrepr = sdscatprintf(cmdrepr,"[%d lua] ",dictid);
    } else if (c->flags & REDIS_UNIX_SOCKET) {
        cmdrepr = sdscatprintf(cmdrepr,"[%d unix:%s] ",dictid,server.unixsocket);
    } else {
        cmdrepr = sdscatprintf(cmdrepr,"[%d %s] ",dictid,getClientPeerId(c));
    }

    // 命令与参数输出,如果是int则用%ld输出,否则用字符串输出
    for (j = 0; j < argc; j++) {
        if (argv[j]->encoding == REDIS_ENCODING_INT) {
            cmdrepr = sdscatprintf(cmdrepr, ""%ld"", (long)argv[j]->ptr);
        } else {
            cmdrepr = sdscatrepr(cmdrepr,(char*)argv[j]->ptr,
                        sdslen(argv[j]->ptr));
        }
        // 如果是最后一个参数
        if (j != argc-1)
            cmdrepr = sdscatlen(cmdrepr," ",1);
    }
    cmdrepr = sdscatlen(cmdrepr," ",2);
    // 创建一个字符串对象cmdobj
    cmdobj = createObject(REDIS_STRING,cmdrepr);

    // 迭代各个监视器,把信息输出
    listRewind(monitors,&li);
    while((ln = listNext(&li))) {
        redisClient *monitor = ln->value;
        addReply(monitor,cmdobj);
    }
    // 减少其引用计数让服务器一会自动回收
    decrRefCount(cmdobj);
}


四 客户端

客户端发送  monitor 命令
redis.c/ monitorCommand()    

// 客户端发送monitor命令的处理函数
void monitorCommand(redisClient *c) {
    /* ignore MONITOR if already slave or in monitor mode */
    // 如果已经是slave模式,或monitor模式(monitor模式的也会打开slave模式),则不理会.
    if (c->flags & REDIS_SLAVE) return;

    // 客户端置位为monitor标记,还会置位为slave.
    c->flags |= (REDIS_SLAVE|REDIS_MONITOR);

    // 把客户端增加到server.monitors链表的表尾
    listAddNodeTail(server.monitors,c);

    // 回复OK
    addReply(c,shared.ok);
}


原文链接:https://blog.csdn.net/whiteoldbig/article/details/51530808

免责声明:文章转载自《Redis 监视器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java基本类型数组初始化ZooKeeper(3)-内部原理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HttpURLConnection使用POST方法参数乱码

如题,HttpURLConnection使用POST方法发起http请求,参数通过form来传递(并非使用URL传递参数),出现了中文乱码的情况。 具体描述为:将请求参数以 Content-Disposition: form-data; name="name" value 形式上传,然后使用OutputStream.write传送,结果中文参数会出现...

Spring Security中实现微信网页授权

微信公众号提供了微信支付、微信优惠券、微信H5红包、微信红包封面等等促销工具来帮助我们的应用拉新保活。但是这些福利要想正确地发放到用户的手里就必须拿到用户特定的(微信应用)微信标识openid甚至是用户的微信用户信息。如果用户在微信客户端中访问我们第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。今天就结合Spring Se...

Linux系统下查找最近修改过的文件

Linux的终端上,没有windows的搜索那样好用的图形界面工具,但find命令确是很强大的。 比如按名字查找一个文件,可以用 find / -name targetfilename 。 唉,如果只知道名字,不知道地点,这样也不失为一个野蛮有效的方法。 按时间查找也有参数 -atime 访问时间 -ctime 改变状态的时间 -mtime修改的时间。但...

ZooKeeper学习总结 第二篇:ZooKeeper深入探讨

其实zookeeper系列的学习总结很早就写完了,这段时间在准备找工作的事情,就一直没有更新了。下边给大家送上,文中如有不恰当的地方,欢迎给予指证,不胜感谢!。 1. 数据模型 1.1. 只适合存储小数据 Zk维护着一个逻辑上的树形层次结构,树中的节点称为znode,个znode都有一个ACL(权限控制)。Zookeeper是被设计用来协调服务的,因此zn...

第三方软件 Serv-u提权

Serv-U FTP Server,是一种被广泛运用的FTP服务器端软件,支持3x/9x/ME/NT/2K等全Windows系列。可以设定多个FTP服务器、限定登录用户的权限、登录主目录及空间大小等   Serv-U提权分两种 1.有修改权限 2.无权限修改 第一种情况时 0.判断是否安装serv-u serv-u的默认端口是43958  可以用nmap...

Monkey APP压力稳定性测试

一、monkey 的使用场景   Monkey 测试是 Android 平台自动化测试的一种手段,通过Monkey程序模拟用户触摸屏幕、滑动Trackball(轨迹球)、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常 用来做什么的 压力稳定性测试 做自动化测试 Monkey 主要用于Android 的压力测试 自动的一个压力测试小工...