我想知道Redis Key *的内部实现。
我正在实现分布式缓存功能。
最佳答案
“KEYS *”命令的内部行为是线性扫描主词典以收集所有键,并生成结果。过期的密钥不包括在内。这是实现:
void keysCommand(redisClient *c) {
dictIterator *di;
dictEntry *de;
sds pattern = c->argv[1]->ptr;
int plen = sdslen(pattern), allkeys;
unsigned long numkeys = 0;
void *replylen = addDeferredMultiBulkLength(c);
di = dictGetSafeIterator(c->db->dict);
allkeys = (pattern[0] == '*' && pattern[1] == '\0');
while((de = dictNext(di)) != NULL) {
sds key = dictGetKey(de);
robj *keyobj;
if (allkeys || stringmatchlen(pattern,plen,key,sdslen(key),0)) {
keyobj = createStringObject(key,sdslen(key));
if (expireIfNeeded(c->db,keyobj) == 0) {
addReplyBulk(c,keyobj);
numkeys++;
}
decrRefCount(keyobj);
}
}
dictReleaseIterator(di);
setDeferredMultiBulkLength(c,replylen,numkeys);
}
发生此操作时,Redis服务器上无法执行任何其他命令,事件循环正在等待KEYS命令的结果。如果密钥数量很大(> 10K),客户端将注意到服务器不再响应。
这是仅用于调试目的的命令。不要在应用程序中使用它。