Redis知識總結--五種基礎數據結構

string

string應該是redis最常被用到的數據結構,簡單的get、set便可操做。java

爲了不內存空間不夠形成頻繁擴容,一般會分配一塊大於value長度的內存空間,空間大小使用capicity表示,value長度使用length表示,capicity>length,底層實現是相似java的ArrayList數據結構,所以是可變的,當value小於1M時,擴容會加倍現有空間,大於1M時,擴容只會增長1M的空間,最多隻能佔用512M的空間redis

實踐中一般會使用setnx和expire的結合使用來實現簡單的分佈式鎖,但這種鎖是悲觀鎖,實際業務場景下須要對被阻塞的業務線程作額外的處理,此外雖然是字符串,但也能夠直接保存數字類型,並使用incr、incrby命令對value進行自增操做。api

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,不能重複且無序ui

zset

即有序set,能夠經過相關命令對設置的score進行排序。線程

zset底層使用的是skipList結構,此結構能夠看作一個多層鏈表,最底層包括全部元素,倒數第二層包括全部元素中的部分元素,倒數第三層又包括倒數第二層中的部分元素等等,這樣進行查找或修改操做時,從頂層開始而後逐級向下查找,會提升操做效率,是比較典型的以空間換時間的解決方案。排序

相關文章
相關標籤/搜索