Redis使用哈希表機制來存儲快速檢索的鍵值。哈希表維護一個桶列表,每個桶都有一個鏈表來存儲鍵值。
當您向db添加密鑰時,它首先使用散列函數來計算索引。索引告訴redis哪個桶應該容納這個密鑰。然後,redis爲key創建一個條目,將條目添加到屬於該bucket的鏈表的頭部,並將值的對象ptr以及鍵對象的ptr保存到條目中。 該條目實際上是鏈接列表的一個元素。
所以,當你想通過鍵找到值,它使用哈希表來實現這一點。您可以閱讀dict.h/dict.c以瞭解更多信息。
更多的相關信息
db.c實現你想知道什麼樣的操作。
void setKey(redisDb *db, robj *key, robj *val) {
if (lookupKeyWrite(db,key) == NULL) {
dbAdd(db,key,val);
} else {
dbOverwrite(db,key,val);
}
incrRefCount(val);
removeExpire(db,key);
signalModifiedKey(db,key);
}
但它只是一個包裝的功能,並在內部使用dbAdd
或dbOverwrite
添加關鍵分貝。
而這是dbAdd
,它使用dictAdd
鏈接鍵和val。
void dbAdd(redisDb *db, robj *key, robj *val) {
sds copy = sdsdup(key->ptr);
int retval = dictAdd(db->dict, copy, val);
serverAssertWithInfo(NULL,key,retval == DICT_OK);
if (val->type == OBJ_LIST) signalListAsReady(db, key);
if (server.cluster_enabled) slotToKeyAdd(key);
}
所以神奇的事情發生在dict.c中,閱讀它!
https://github.com/antirez/redis#serverh –