zoukankan      html  css  js  c++  java
  • redis cluster keys命令实现

    redis整个db都是一个哈希字典表(不支持范围查找), 那这样的话keys命令需要遍历db里所有的key吗??渣浪多年前就热衷于用xxx_yyy_zzz_*的方式去匹配key了,为什么他们热衷于这样做, 是不是redis有特殊的优化技巧呢? 带着这些疑问下载了最新版Redis代码。

    目标:

    1. 定位keys的实现方式, 是否真的低性能。--done

    2. 定位redis-cluster里主机不分发keys给集群里其它主机的原因。 --done

    keys命令确实需要遍历整个数据库,详情 见db.c::keysCommand

    1. 服务器启动阶段,server.c::initServerConfig()调用populateCommandTable加载命令列表;

    redis所支持的命令列表是下面硬编码 , 可以看到keys命令处理函数(keysCommand)的逻辑是, 遍历数据库的所有key.

    struct redisCommand redisCommandTable[] = {
        {"module",moduleCommand,-2,"as",0,NULL,0,0,0,0,0},
        {"get",getCommand,2,"rF",0,NULL,1,1,1,0,0},
        {"set",setCommand,-3,"wm",0,NULL,1,1,1,0,0},
        //...
        {"keys",keysCommand,2,"rS",0,NULL,0,0,0,0,0},
        //...
    };

     

    keys命令不带key,且redis没有定义汇总各节点查询结果的逻辑,所以不路由keys命令。详情见server.c::processCommand()

      

    看了上述代码,对渣浪的行为产生了深深疑惑。

    小结

    1. keys命令是通过遍历全部db下key再过滤实现的。

    2. keys命令不会被cluster路由给其它集群节点,更不会返回集群各节点keys结果的汇总结果。

  • 相关阅读:
    【工具相关】iOS-Reveal的使用
    iOS-策略模式
    iOS-观察者模式
    iOS-工厂模式
    iOS-MVC模式
    iOS-Delegate模式
    iOS----单例模式(Singleton)
    iOS----支付(微信支付、支付宝支付、银联支付控件集成支付)(转)
    详解Linux系统下PXE服务器的部署过程
    配置iptables实现本地端口转发的方法详解
  • 原文地址:https://www.cnblogs.com/yinkw/p/redis_keys.html
Copyright © 2011-2022 走看看