2014-02-21 36 views

回答

2

「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),客戶端會注意到服務器不再有響應。

這是一個僅用於調試目的的命令。不要在應用程序中使用它。