前言
前面我們已經介紹了Redis的鍵值對存儲管理的底層數據結構。如果不清楚的同志可以看我前面的博客
Redis數據庫存儲鍵值對的底層原理-CSDN博客
下面,我們來看一下Redis鍵值對中值的數據結構有那些叭
Redis常見的5種數據類型
string? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 動態字符串,可擴容
list列表? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?壓縮列表、雙向鏈表
hash散列? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 壓縮列表、哈希表
set無序唯一集合,可求交集、并集、差集? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 哈希表
zset有序集合分值排序(分值可以重復) zset不支持差集運算? ? ? ? ? ? ? ? ? ? ? ? 壓縮列表、跳表
所以,我們常見的Redis鍵值對中值的數據結構有字符串、雙向鏈表、哈希表、壓縮列表和跳表
字符串和雙向鏈表就不需要過多解釋,非常常見,哈希表在前面已經解釋過了,如果不清楚的同志可以看我的上篇文章
Redis數據庫存儲鍵值對的底層原理-CSDN博客
所以我們現在需要重點講解一下,壓縮列表和跳表
壓縮列表
壓縮列表就是可以理解為是一個數組
與數組不同的是
1、壓縮列表存儲的是序列化之后的值
2、壓縮列表在表頭有三個字段,分別是列表字節長度、列表尾節點的字節偏移量、列表中數據的個數,為數組提供高效的尾部數據插入
????????我們可以使用表頭的三個字段快速訪問到數組的第一項數據和最后一項數據,?查找其他元素時,就沒有這么?效了,只能逐個查找
列表尾節點的字節偏移量可以理解為不帶最后一項數據的數組字節長度
其中,list列表、hash、set集合、有序集合zset在數據量少的時候使用的就是壓縮列表
跳表
有序鏈表只能逐?查找元素,導致操作起來?常緩慢,于是就出現了跳表。具體來說,跳表在鏈表 的基礎上,增加了多級索引,通過索引位置的?個跳轉,實現數據的快速定位
跳表上面的索引也是使用鏈表做的,比如第0層為有序鏈表,第1層隔一個節點取一個節點組成鏈表索引,依次操作,直至最頂層最少為一個節點
優先使用壓縮列表原因
數據量少的情況下使用壓縮列表的原因
壓縮列表本質就是一個帶有三個字段表頭的數組
1、內存利?率,數組和壓縮列表都是?常緊湊的數據結構,它?鏈表占?的內存 要更少
2、Redis是內存數據庫,?量數據存到內存中,此時需要做盡可能的優化,提?內存的利?率。
3、數組對CPU?速緩存?持更友好,所以Redis在設計時,集合數據元素較少情況下, 默認采?內存緊湊排列的?式存儲,同時利?CPU?速緩存不會降低訪問速度。當數據元素超 過設定閾值后,避免查詢時間復雜度太?,轉為哈希和跳表數據結構存儲,保證查詢效率