马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
语法:
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
源码分析
- void keysCommand(client *c)
- {
- dictIterator *di;
- dictEntry *de;
- // 获取当前的匹配模式
- sds pattern = c->argv[1]->ptr;
- int plen = sdslen(pattern), allkeys;
- unsigned long numkeys = 0;
- void *replylen = addReplyDeferredLen(c);
- // 获取数据字典的迭代器
- di = dictGetSafeIterator(c->db->dict);
- // 判断是否获取全部
- allkeys = (pattern[0] == '*' && plen == 1);
- // 遍历迭代器
- while ((de = dictNext(di)) != NULL)
- {
- // 获取当前遍历的key
- sds key = dictGetKey(de);
- robj *keyobj;
- // 如果是获取全部key 或是 当前的key符合匹配模式
- if (allkeys || stringmatchlen(pattern, plen, key, sdslen(key), 0))
- {
- // 当前当前的key转换成robj对象
- keyobj = createStringObject(key, sdslen(key));
- // 如果key没有过期,则加入响应缓存
- if (!keyIsExpired(c->db, keyobj))
- {
- addReplyBulk(c, keyobj);
- numkeys++;
- }
- decrRefCount(keyobj);
- }
- }
- // 遍历结束,释放对象
- dictReleaseIterator(di);
- setDeferredArrayLen(c, replylen, numkeys);
- }
复制代码 上面的源码中可以看到:
- keys 必要遍历全部key
- 遍历的全部的key都要和pattern 举行比力
以是在生产环境中,要很审慎利用keys 下令,克制遍历过多的key而壅闭。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |