Redis數據庫各類數據結構的內部實現。

Redis數據庫是一種非關係型數據庫,基於key/value對,運行時加載到內存,對value支持虛擬內存, 支持多種數據結構,支持持久化,以性能著稱,可用於存儲,緩存,消息隊列等場景。主要介紹下Redis運行時維護的數據結構,以展現其工做方式。html

1.整體設計。redis

  首先,Redis沒有MySQL那樣的索引機制,由於其內建一個基於hash的字典,以下圖:sql

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
相關文章
相關標籤/搜索