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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM