Epoll模型
五個常用Redis的數據結構,以及它們各自的底層實現結構。
字符串散列列表集排序集(zset)
string的底層實現是簡單的動態字符串(SDS -simple dynamic string)。
hash的底層實現是壹個哈希表或壹個ziplist。
list的底層實現是壹個快速列表或壓縮列表。
set的底層實現是哈希表或整數數組。
sortset(zset)的底層實現是壓縮列表或跳過列表。
每個數據結構的底層實現概述
值為字符串類型時有三種情況。
(1).當設置值為整數類型時,redis的底層會將字符串類型轉換為int來存儲。
(2)當設定值小於或等於44字節時,使用的編碼為embstr。
(3)當設定值大於44字節時,使用的代碼是raw。
Redis是用C語言寫的,其中字符串類型是通過字符數組char[]實現的。Redis並沒有直接使用C語言中字符數組的形式,而是改造構建了壹個SDS的數據結構。
列表的底層是通過使用快速雙向鏈表quicklist或壓縮鏈表ziplist實現的。
列表底層之所以不用傳統的雙向鏈表結構,是因為
(1),雙向鏈表需要壹個前指針和壹個後指針,每個指針分別占用8個字節,占用內存很大。
(2)鏈表的壹個通病是會形成很多內存碎片。
壓縮鏈表的Ziplist結構是
快速雙向鏈表的快速列表結構
hash的底層實現是hashtable或ziplist。
hashtable的底層實現
當數據量很小或者是單個元素時,底層使用ziplist存儲,可以通過配置來確定。
1,hashtable是無序的,ziplist是有序的。
2.如果可以用hash,先用hash,不要用String,因為如果用太多的String,會創建太多的key。當鍵太多時,很容易發生哈希碰撞,所以需要經常重散列,每次重散列都會產生兩倍的內存,造成內存浪費。
hash的底層實現是整數數組intset或hashtable。
當集合是整數時,集合的底層實現通過使用intset結構來實現。
如果集合中有字符串值,使用hashtable實現。
Intset是有序的,hashtable是無序的。
sortset的底層是利用壓縮列表ziplist或skiplist的結構實現的。
數據量小的時候可以用ziplist實現,數據量大的時候可以用配置實現。
默認設置下的底層結構
skiplist的底層實現
在尋找對應的元素時,先從最高索引層開始尋找,比如找c 150,再從L1開始尋找,L1的指針指向b,如果發現b120小於150,那麽後面繼續尋找。如果B的指針指向null,那麽在下壹層找,然後在下壹層B的指針找。
1 、/ u 010710458/article/details/80604740