Redis原理:keys下令

[复制链接]
发表于 2025-9-30 02:37:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
语法:
keys pattern
返回全部符合pattern的key
支持 glob-style patterns:

  • h?llo matches hello, hallo and hxllo
  • h*llo matches hllo and heeeello
  • h[ae]llo matches hello and hallo, but not hillo
  • h[^e]llo matches hallo, hbllo, ... but not hello
  • h[a-b]llo matches hallo and hbllo
源码分析
  1. void keysCommand(client *c)
  2. {
  3.     dictIterator *di;
  4.     dictEntry *de;
  5.     // 获取当前的匹配模式
  6.     sds pattern = c->argv[1]->ptr;
  7.     int plen = sdslen(pattern), allkeys;
  8.     unsigned long numkeys = 0;
  9.     void *replylen = addReplyDeferredLen(c);
  10.     // 获取数据字典的迭代器
  11.     di = dictGetSafeIterator(c->db->dict);
  12.     // 判断是否获取全部
  13.     allkeys = (pattern[0] == '*' && plen == 1);
  14.     // 遍历迭代器
  15.     while ((de = dictNext(di)) != NULL)
  16.     {
  17.         // 获取当前遍历的key
  18.         sds key = dictGetKey(de);
  19.         robj *keyobj;
  20.         // 如果是获取全部key 或是 当前的key符合匹配模式
  21.         if (allkeys || stringmatchlen(pattern, plen, key, sdslen(key), 0))
  22.         {
  23.             // 当前当前的key转换成robj对象
  24.             keyobj = createStringObject(key, sdslen(key));
  25.             // 如果key没有过期,则加入响应缓存
  26.             if (!keyIsExpired(c->db, keyobj))
  27.             {
  28.                 addReplyBulk(c, keyobj);
  29.                 numkeys++;
  30.             }
  31.             decrRefCount(keyobj);
  32.         }
  33.     }
  34.     // 遍历结束,释放对象
  35.     dictReleaseIterator(di);
  36.     setDeferredArrayLen(c, replylen, numkeys);
  37. }
复制代码
上面的源码中可以看到:

  • keys 必要遍历全部key
  • 遍历的全部的key都要和pattern 举行比力
以是在生产环境中,要很审慎利用keys 下令,克制遍历过多的key而壅闭。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表