跋山涉水 —— 深入 Redis 字典遍歷
08-24
跋山涉水 —— 深入 Redis 字典遍歷
來自專欄碼洞9 人贊了文章
Redis 字典的遍歷過程邏輯比較複雜,互聯網上對這一塊的分析講解非常少。我也花了不少時間對源碼的細節進行了整理,將我個人對字典遍歷邏輯的理解呈現給各位讀者。也許讀者們對字典的遍歷過程有比我更好的理解,還請不吝指教。
一邊遍歷一邊修改
我們知道 Redis 對象樹的主幹是一個字典,如果對象很多,這個主幹字典也會很大。當我們使用 keys 命令搜尋指定模式的 key 時,它會遍歷整個主幹字典。值得注意的是,在遍歷的過程中,如果滿足模式匹配條件的 key 被找到了,還需要判斷 key 指向的對象是否已經過期。如果過期了就需要從主幹字典中將該 key 刪除。
void keysCommand(client *c) { dictIterator *di; // 迭代器 dictEntry *de; // 迭代器當前的entry sds pattern = c->argv[1]->ptr; // keys的匹配模式參數 int plen = sdslen(pattern); int allkeys; // 是否要獲取所有key,用於keys *這樣的指令 unsigned long numkeys = 0; void *replylen = addDeferredMultiBulkLength(c); // why safe? di = dictGetSafeIterator(c->db->dict); allkeys = (pattern[0] == * && pattern[1] ==