當前位置:成語大全網 - 書法字典 - 4.Redis高性能的基本原理。

4.Redis高性能的基本原理。

內存讀寫很快。

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