redis 5種基本類型實現原理

Redis主要支持的數據類型有5種:String ,Hash ,List ,Set ,和 Sorted Set。redis

字符串類型數據結構

  • 能存儲任何形式的字符串,包括二進制數據
  • 一個字符類型鍵容許存儲的最大容量是512M
  • 內部數據結構
    • 經過 int、SDS(simple dynamic string)做爲結構存儲
      • int用來存放整型數據,sds存放字節/字符串和浮點型數據
    • redis3.2分支引入了五種sdshdr類型,
      • 目的是爲了知足不一樣長度字符串可使用不一樣大小的Header,從而節省內存

列表類型ui

  • 列表類型內部使用雙向鏈表實現
  • 內部數據結構
    • value對象內部以linkedlist或者ziplist來實現
      • 當list的元素個數和單個元素的長度比較小的時候,
        • Redis會採用ziplist(壓縮列表)來實現來減小內存佔用。
      • 不然就會採用linkedlist(雙向鏈表)結構。
    • redis3.2以後,採用的一種叫quicklist的數據結構
      • 兩者結合
      • quicklist仍然是一個雙向鏈表,只是列表的每一個節點都是一個ziplist

hash類型指針

  • 數據結構
    • map提供兩種結構來存儲,
      • 一種是hashtable、
      • 另外一種是前面講的ziplist,
        • 數據量小的時候用ziplist.
    • 在redis中,哈希表分爲三層
      • dictEntry
        • 管理一個key-value,
        • 同時保留同一個桶(bucket)中相鄰元素的指針,
        • 用來維護哈希桶(bucket)的內部鏈
        • typedef struct dictEntry {
          void *key;
          union { //由於value有多種類型,因此value用了union來存儲
          void *val;
          uint64_t u64;
          int64_t s64;
          double d;
          } v;
          struct dictEntry *next;
          //下一個節點的地址,用來處理碰撞,全部分配到同一索引的元素經過next指針
          //連接起來造成鏈表key和v均可以保存多種類型的數據
          } dictEntry;

           

      • dictht
        • 實現一個hash表會使用一個buckets存放dictEntry的地址
        • 經過hash(key)%len獲得的值就是buckets的索引
        • typedef struct dictht {
          dictEntry **table;//buckets的地址
          unsigned long size;//buckets的大小,總保持爲 2^n
          unsigned long sizemask;//掩碼,用來計算hash值對應的buckets索引
          unsigned long used;//當前dictht有多少個dictEntry節點
          } dictht;
      • dict
        • dictht實際上就是hash表的核心
        • 只有一個dictht還不夠,好比rehash、遍歷hash等操做,
          • 因此redis定義了一個叫dict的結構以支持字典的各類操做,
          • 當dictht須要擴容/縮容時,用來管理dictht的遷移

集合類型code

  • 不能有重複數據,
  • 同時集合類型中的數據是無序的
  • 集合類型和列表類型的最大的區別是
    • 有序性
      • 列表有序
    • 惟一性
      • 集合惟一
  • 使用的值爲空的散列表(hash table),
    • 因此這些操做的時間複雜度都是O(1).
  • 數據結構
    • 底層數據結構以intset或者hashtable來存儲

有序集合對象

  • 有序集合類型爲集合中的每一個元素都關聯了一個分數
  • 數據結構
    • 內部是以ziplist或者skiplist+hashtable來實現
    • skiplist,也就是跳躍表
    • 跳躍表blog

      • 跳躍表是一種隨機化的數據結構,
        • 在查找、插入和刪除這些字典操做上,
          • 其效率可比擬於平衡二叉樹(如紅黑樹)
相關文章
相關標籤/搜索