我想知道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),客户端将注意到服务器不再响应。

这是仅用于调试目的的命令。不要在应用程序中使用它。

10-04 20:31