1
我想知道Redis Key *的內部實現。 我正在實現分佈式緩存功能。Redis內部如何實現Key?
我想知道Redis Key *的內部實現。 我正在實現分佈式緩存功能。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),客戶端會注意到服務器不再有響應。
這是一個僅用於調試目的的命令。不要在應用程序中使用它。