1. 程式人生 > >Redis知識總結--五種基礎資料結構

Redis知識總結--五種基礎資料結構

string

string應該是redis最常被用到的資料結構,簡單的get、set即可操作。

為了避免記憶體空間不夠造成頻繁擴容,通常會分配一塊大於value長度的記憶體空間,空間大小使用capicity表示,value長度使用length表示,capicity>length,底層實現是類似java的ArrayList資料結構,因此是可變的,當value小於1M時,擴容會加倍現有空間,大於1M時,擴容只會增加1M的空間,最多隻能佔用512M的空間

實踐中通常會使用setnx和expire的結合使用來實現簡單的分散式鎖,但這種鎖是悲觀鎖,實際業務場景下需要對被阻塞的業務執行緒做額外的處理,此外雖然是字串

,但也可以直接儲存數字型別,並使用incr、incrby命令對value進行自增操作。

list

作用類似java的ArrayList,但底層使用的是quickList資料結構,既可以使用命令模擬資料結構中的佇列(先進先出),也可以模擬棧(先進後出)。

由於使用了LinkedList,佇列的修改時間複雜度為O(1),但遍歷時間複雜度為O(n),使用時需要注意。 由於LinkedList比較佔空間,redis針對此結構做了優化,當list較小時,redis使用的是zipList--列表元素使用一整塊連續的記憶體空間,當超過一定大小時,redis會用雙向連結串列將多個zipList連結起來,這種資料結構被稱為quickList

hash

hash的實現類似java的HashMap,都是陣列+連結串列的底層實現。

值得一提的是redis對rehash操作進行了優化,不同於jdk中的一次性全部rehash完畢,redis使用的漸進式的rehash策略,即陸續rehash,同時不阻塞主執行緒的執行。

set

set可以看做value為null的hash,不能重複且無序

zset

即有序set,可以通過相關命令對設定的score進行排序。

zset底層使用的是skipList結構,此結構可以看做一個多層連結串列,最底層包括所有元素,倒數第二層包括所有元素中的部分元素,倒數第三層又包括倒數第二層中的部分元素等等,這樣進行查詢或修改操作時,從頂層開始然後逐級向下查詢,會提高操作效率,是比較典型的以空間換時間的解決方案。