Redis數據庫是一種非關系型數據庫,基於key/value對,運行時加載到內存,對value支持虛擬內存, 支持多種數據結構,支持持久化,以性能著稱,可用於存儲,緩存,消息隊列等場景。主要介紹下Redis運行時維護的數據結構,以展示其工作方式。
1.總體設計。
首先,Redis沒有MySQL那樣的索引機制,因為其內建一個基於hash的字典,如下圖:

Redis 計算哈希值和索引值的方法如下:
# 使用字典設置的哈希函數,計算鍵 key 的哈希值 hash = dict->type->hashFunction(key); # 使用哈希表的 sizemask 屬性和哈希值,計算出索引值 # 根據情況不同, ht[x] 可以是 ht[0] 或者 ht[1] index = hash & dict->ht[x].sizemask;
插入數據時,根據以上算出index,然后根據index值放入table表中相應位置即可。
2. string類型
例如:Set hello world
3. list類型
例如:Lpush list aaaa bbb ccc
4. hash類型
例如:Hset test hello world

注:新建一個hash對象時開始是用zipmap(又稱為small hash)來存儲的。這個zipmap其實並不是hash table,但是zipmap相比正常的hash實現可以節省不少hash本身需要的一些元數據存儲開銷。盡管zipmap的添加,刪除,查找都是O(n),但是由於一般對象的field數量都不太多。所以使用zipmap也是很快的,也就是說添加刪除平均還是O(1)。如果field或者value的大小超出一定限制后,Redis會在內部自動將zipmap替換成正常的hash實現(一個key對應一個hash表)。
參考:
http://www.slideshare.net/iammutex/redis-9948788
http://blog.nosqlfan.com/html/3525.html?ref=rediszt
http://redisbook.com/preview/dict/hash_algorithm.html


