Redis的5種基礎數據結構

string(字符串):

1.字符串是Redis最簡單的數據結構,它的內部表示就是一個字符數組。

2.Redis的字符串是動態字符串,是可以修改的字符串,內部結構的實現類似於Java的ArrayList,採用預分配冗餘空間的方式來減少內存的頻繁分配。

3.內部爲當前字符串分配的實際空間XXXX一般要高於實際字符串長度XXXX.length。當字符串長度小於1MB時,擴容都是加倍現有的空間。如果字符串長度超過1MB,擴容時一次只會多擴1MB的空間。需要注意的是字符串最大長度爲512MB。

4.可以對多個字符串進行批量讀寫,節省網絡耗時開銷。

5.可設置過期時間並對值進行自增(自增有範圍,範圍在signed long的最大值和最小值之間,超出了會報錯)。

6.字符串由多個字節組成,每個字節又由8個bit組成,如此便可以將一個字符串看成很多bit的組合,這便是bitmap(位圖)數據結構。

 

 

list(列表):

1.Redis的列表相當於Java的LinkedList,注意它是鏈表而不是數組。這意味着list的插入和刪除操作非常快,時間複雜度爲O(1),但是索引定位很慢,時間複雜度爲O(n)。

2.列表中的每個元素都使用雙向指針順序,串起來可同時支持前向後向遍歷。

3.當列表彈出了最後一個元素之後,該數據結構被自動刪除,內存被回收。

4.Redis的列表結構常用來做異步隊列使用。將需要延後處理的任務結構體序列化成字符串,塞進Redis的列表,另一個線程從這個列表中輪詢數據進行處理。

5.隊列是先進先出的數據結構,常用於消息排隊和異步邏輯處理,它會確保元素的訪問順序性。

6.棧是先進後出的數據結構,跟隊列正好相反。拿Redis的列表數據結構來做棧使用的業務場景並不多見。

7.慢操作:lindex相當於Java鏈表的get(int index)方法,它需要對鏈表進行遍歷,性能隨着參數index增大而變差。

8.快速列表:Redis底層存儲的不是一個簡單的linkedlist,而是稱之爲“快速鏈表”(quicklist)的一個結構。首先在列表元素較少的情況下,會使用一塊連續的內存存儲,這個結構是ziplist,即壓縮列表。它將所有的元素彼此緊挨着一起存儲,分配的是一塊連續的內存。當數量比較多的時候纔會改成quicklist。因爲普通的鏈表需要的附加指針空間太大,會浪費空間,還會加重內存的碎片化,比如某普通鏈表裏存的只是int類型的數據,結構上還需要兩個額外的指針prev和next。所以Redis將鏈表和ziplist結合組成了quicklist,也就是將多個ziplist使用雙向指針串起來使用。quicklist擠滿足了快速的插入刪除性能,又不會出現太大的空間冗餘。

                   

 

 

hash(字典):

1.Redis的字典相當於Java裏面的HashMap,它是無需字典,內部存儲了很多鍵值對,都是“數組+鏈表”二維結構。第一維hash的數組位置碰撞時,就會將碰撞的元素使用鏈表串接起來。

2.不同的是,Redis的字典的值只能是字符串,另外它們rehash的方式不一樣,因爲Java的HashMap在字典很大時,rehash是個耗時的操作,需要一次性全部rehash。Redis爲了追求高性能,不能堵塞服務,所以採用了漸進式rehash策略。

3.漸進式rehash會在rehash的同時,保留新舊兩個hash結構,查詢時會同時查詢兩個hash結構,然後再後續的定時任務以及hash操作指令中,循序漸進地將舊hash的內容一點點地遷移到新的hash結構中。當搬遷完成了,就會使用新的hash結構取而代之了。

4.當hash移除了最後一個元素之後,該數據結構被自動刪除,內存被回收。

5.注意,hash結構的存儲消耗要高於單個字符串。

6.同字符串一樣,hash結構中的單個子key也可以進行計數,它對應的指令是hincrby,和incr的使用方法基本一樣。

 

 

set(集合):

1.Redis的集合相當於Java裏面的HashSet,它內部的鍵值對是無序的、唯一的。他的內部實現相當於一個特殊的字典,字典中所有的value都是一個值NULL。

2.當集合中最後一個元素被移除之後,數據結構被自動刪除,內存被回收。

3.用來做涉及到去重的功能很方便。

 

 

zset(有序列表):

1.zset可能是Redis提供的最有特色的數據結構,它類似於Java的SortedSet和HashMap的結合體:一方面它是一個set,保證了內部value的唯一性,另一方面它可以給每個value賦予一個score,代表了這個value的排序權重。它的內部實現用的是一種叫做“跳躍列表”的數據結構。

2.zset中最後一個value被移除之後,數據結構被自動刪除,內存被回收。

3.用來做涉及到去重並且需要排序的集合功能很方便.

 

 

容器型數據結構(list、set、hash、zset)的通用規則:

1.如果容器不存在,那就創建一個,再進行操作。

2.如果容器裏的元素沒有了,那麼立即刪除容器,釋放內存。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章