Redis - redis 為什么是單線程,為什么使用跳表作為索引?


單線程的redis為什么這么快

  1)絕大部分請求是純粹的內存操作(非常快速);

  2)采用單線程,避免了不必要頻繁的上下文切換和競爭條件;

  3)非阻塞I/O多路復用機制

對於大量的請求怎么樣處理

  redis是一個單線程程序,也就是說同一時刻它只能處理一個客戶端請求;
  redis是通過IO多路復用(select,epoll, kqueue,依據不同的平台,采取不同的實現)來處理多個客戶端請求。

redis為什么使用跳表作為索引,不使用B+樹

  因為B+樹的原理是葉子節點存儲數據,非葉子節點存儲索引,B+樹的每個節點可以存儲多個關鍵字,它將節點大小設置為磁盤頁的大小,充分利用了磁盤預讀的功能。每次讀取磁盤頁時就會讀取一整個節點,每個葉子節點還有指向前后節點的指針,為的是最大限度的降低磁盤的IO;

  而Redis是內存中讀取數據,不涉及IO,因為數據在內存中讀取耗費的時間是從磁盤的IO讀取的百萬分之一,因此使用了跳表,利用空間換時間的方式,實現簡單,且能提高查詢效率。

redis為什么使用跳表作為索引,不使用紅黑樹

  選擇跳躍表而非紅黑樹作為有序集合實現方式的原因,並非是基於並發上的考慮,redis是單線程,僅僅是因為跳躍表的實現相較於紅黑樹更加簡潔,內存占用更有優勢

Redis 中的有序集合(Zset)支持的核心操作主要有以下幾個:

  • 插入一個數據
  • 刪除一個數據
  • 查找一個數據
  • 按照區間查找數據
  • 迭代輸出有序序列

其中,插入、刪除、查找以及迭代輸出有序序列這幾個操作,紅黑樹也可以完成,時間復雜度和跳表是一樣的。

按照區間查找數據這個操作,紅黑樹的效率沒有跳表高。跳表(查看實現原理)可以在 O(logn) 時間復雜度定位區間的起點,然后在原始鏈表中順序向后查詢就可以了,這樣非常高效【空間換時間,增加多級索引,從上往下開始查找】。此外,相比於紅黑樹,跳表還具有代碼更容易實現、可讀性好、內存占用更有優勢、不容易出錯、更加靈活等優點,因此 Redis 用跳表來實現。


免責聲明!

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



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