redis為什麼選擇了跳躍表而不是紅黑樹

2022-05-17 01:35:55 字數 797 閱讀 5473

redis只在兩個地方用到了跳躍表,乙個是實現有序集合鍵(zset),另乙個是在集群節點中用作內部資料結構,除此之外,跳表在redis裡面沒有其他用途。

但是為什麼用跳表而不用紅黑樹呢?猜想如下:

1)在做範圍查詢的時候,平衡樹比skiplist操作要複雜。在平衡樹上,我們找到指定範圍的小值之後,還需要以中序遍歷的順序繼續尋找其它不超過大值的節點。如果不對平衡樹進行一定的改造,這裡的中序遍歷並不容易實現。而在skiplist上進行範圍查詢就非常簡單,只需要在找到小值之後,對第1層鍊錶進行若干步的遍歷就可以實現。

2)平衡樹的插入和刪除操作可能引發子樹的調整,邏輯複雜,而skiplist的插入和刪除只需要修改相鄰節點的指標,操作簡單又快速。

3)從記憶體占用上來說,skiplist比平衡樹更靈活一些。一般來說,平衡樹每個節點包含2個指標(分別指向左右子樹),而skiplist每個節點包含的指標數目平均為1/(1-p),具體取決於引數p的大小。如果像redis裡的實現一樣,取p=1/4,那麼平均每個節點包含1.33個指標,比平衡樹更有優勢。

4)查詢單個key,skiplist和平衡樹的時間複雜度都為o(log n),大體相當;而雜湊表在保持較低的雜湊值衝突概率的前提下,查詢時間複雜度接近o(1),效能更高一些。所以我們平常使用的各種map或dictionary結構,大都是基於雜湊表實現的。

5)從演算法實現難度上來比較,skiplist比平衡樹要簡單得多。

結合書籍《redis設計與實現(第二版)》裡面的一段描述進行理解:

為什麼選擇Redis快取?

為了追求極致的產品體驗,網際網路企業架構的高效能和高可用便不可避免。而在資料庫層面,一般有以下幾種優化 1.主從配置 比如為mysql服務配置主從,則一台宕機,另一台頂上,達到高可用的要求。2.讀寫分離 配置一主多從,將讀取請求分發到從伺服器上,可以有效的提高響應速度。3.分庫分表 當資料量不斷增加...

為什麼他們選擇了GaussDB

資料庫和數倉是承載金融等企業核心交易業務與資料處理的基石。華為雲stack為政企客戶提供基於opengauss開放生態的企業級分布式資料庫gaussdb for opengauss 具備企業級複雜事務混合負載能力,支援分布式事務 同城跨az及兩地三中心部署。資料0丟失,1000 擴充套件能力,pb級...

快取(五) 為什麼選擇redis

redis是乙個開源的使用ansi c語言編寫 支援網路 可基於記憶體亦可持久化的日誌型 key value資料庫,並提供多種語言的api redis 是tcp socket 網路環境,client 發包到 redis,報文格式是resp,非常短小精悍的乙個報文體系,而在服務端redis 是單執行緒...