1. 程式人生 > 實用技巧 >3.單機資料庫-資料結構(字典、跳躍表、壓縮列表)

3.單機資料庫-資料結構(字典、跳躍表、壓縮列表)

一、字典

字典是Redis資料型別 hash 和 set 的底層結構。

雜湊衝突:指兩個 key的雜湊值和雜湊桶計算對應關係時,正好落在一個桶。Redis解決雜湊衝突的方式是鏈式雜湊,同一個桶中的元素以連結串列的形式儲存。

這裡存在一個問題,如果連結串列過長會造成查詢元素耗時長,效率低。Redis通過rehash來解決

rehash

rehash 的思想是讓元素分散在更多的桶中,減少單個桶中的元素數量,從而減少單個桶中的衝突。

Redis 預設使用兩個雜湊表:雜湊表1和雜湊表2,剛開始儲存資料時使用雜湊表1,此時雜湊表B沒有被分配空間。當雜湊表A中資料量過多時,給雜湊表2分配更大的空間,把雜湊表1的資料拷貝到雜湊表2中,最後釋放雜湊表1的空間,留下來雜湊表1擴容備用。

但這裡同樣存在一個問題,如果一次性把雜湊表A中的資料都拷貝到雜湊表B中,會造成Redis執行緒阻塞。Redis通過漸進式rehash來解決這個問題

漸進式rehash

在第二步拷貝資料時,Redis 仍然正常處理客戶端請求,每處理一個請求時,從雜湊表1中的第一個索引位置開始,順帶著將這個索引位置上的所有 entries 拷貝到雜湊表 2 中;等處理下一個請求時,再順帶拷貝雜湊表 1 中的下一個索引位置的 entries。如下圖所示:

這樣就把一次性大量拷貝的開銷,分攤到多次處理請求的過程中,避免了耗時操作,保證了資料的快速訪問。

二、跳躍表

有序集合的底層實現之一

1.結構

Redis 的跳躍表由redis.h/zskiplistNode

redis.h/zskiplist兩個結構定義, 其中zskiplistNode結構用於表示跳躍表節點, 而zskiplist結構則用於儲存跳躍表節點的相關資訊, 比如節點的數量, 以及指向表頭節點和表尾節點的指標

2.特性

  • 每個跳躍表節點的層高都是1至32之間的隨機數
  • 在同一個跳躍表中, 多個節點可以包含相同的分值, 但每個節點的成員物件必須是唯一的。
  • 跳躍表中的節點按照分值大小進行排序, 當分值相同時, 節點按照成員物件的大小進行排序。

三、壓縮列表

當一個集合只包含整數值元素,並且這個集合的元素數量不多時,Redis 就會使用整數集合作為 Set的底層實現

1.結構

2.特性