Redis 底層數據結構介紹

Redis 底層數據結構

Redis 底層數據結構

版本:2.9redis

支持的數據類型:算法

  1. 字符串
  2. 散列
  3. 列表
  4. 集合
  5. 有序集合

字符串

Redis 利用原生的 c 字符串進行了一次封裝。封裝的字符串叫作簡單動態字符串:SDS(simple dynamic string)
Redis 使用的簡單動態字符串比 c 語言原生的字符串有如下優勢:數據庫

  1. 獲取字符串長度的複雜度爲O(1)
  2. 不存在緩存區溢出
  3. 修改字符串長度時,不須要頻繁分配內存
  4. 空間預分配策略
  5. 惰性空間策略
  6. 二進制安全
  7. 二進制安全的意思是,能夠將二進制數據使用 SDS 存儲,而不會存在 c 語言中,遇到 \0 是字符串結尾的狀況。
  8. 兼容部分 c 字符串函數
  9. 由於 SDS 遵循 c 語言以 \0 結尾的慣例,因此 SDS 可使用 <string.h> 函數庫,避免了重複代碼

鏈表

鏈表做爲最經常使用的數據結構之一,在 redis 中的使用場景是不少的,其中包括:數組

  1. 發佈、訂閱
  2. 列表鍵
  3. 慢查詢
  4. 監視器
  5. 多個客戶端狀態
  6. 客戶端緩衝區

Redis 中鏈表的幾個特性:緩存

  1. 雙向鏈表
  2. 無環
  3. 有表頭和表尾指針
  4. 有鏈表長度計數器
  5. 多態(能夠用來保存不一樣類型的值)

字典

字典又叫符號表,在 PHP 中叫關聯數組,在 JAVA 中叫映射(map),在 Python 中叫字典(dict)。別管這麼多叫法,字典就是一種保存鍵值對的一種數據結構。安全

使用場景

  1. 散列(hash)
  2. Redis 數據庫

字典實現

Redis 使用 c 語言構建了本身的字典實現。hash 算法使用的是 murmurhash3 算法。遇到鍵的 hash 值衝突使用的解決方法是鏈地址法。當須要擴展時,Redis 利用兩個哈希表進行漸進式的 rehash。服務器

字典(內部的哈希表)擴展與收縮條件

哈希表內部會經過公式計算一個負載因子。公式爲:數據結構

load_factor=ht[0].used/ht[0].Size

擴展條件:函數

  1. 服務器目前沒有在執行 BGSAVE 命令或者 BGREWRITEAOF 命令,而且哈希表的負載因子大於等於1。
  2. 服務器目前正在執行 BGSAVE 命令或者 BGREWRITEAOF 命令,而且哈希表的負載因子大於等於5。

收縮條件:負載因子小於 0.1指針

跳躍表

跳躍表的結構:

跳躍表是一種對標平衡樹的一種數據結構。可是比平衡樹更簡單、更快速、使用更少空間。因此通常都會使用跳躍表。
跳躍表在 Redis 中的使用場景暫時僅限於實現有序集合。
跳躍表的實現參見:http://blog.jobbole.com/111731/

整數集合

整數集合的使用場景爲元素很少且只包含整數元素的集合。
使用 c 數組實現。

壓縮列表(ziplist)

壓縮列表是 Redis 爲了節省內存實現的。當列表鍵和哈希鍵的項比較少,而且存儲的值比較小時,會使用壓縮列表節省內存。

相關文章
相關標籤/搜索