redis的數據類型都是通過多種數據結構來實現,主要是出於時間和空間的考慮,當數據量小的時候通過數組下標訪問最快,占用內存最小【壓縮列表是數組的變種,允許存儲的數據大小不同】
因為數組需要占用連續的內存空間,所以當數據量大的時候,就需要使用鏈表,同時為了保證速度又需要和數組結合,也就有了散列表。
1、字符串
2、列表(list):支持存儲一組數據,這種數據類型對應兩種實現方法,一種是壓縮列表,另一種是雙向循環鏈表
壓縮列表:數據集比較少的時候,采用壓縮列表
redis自己設計的一種存儲結構,類似數組,通過一片連續的內存空間來存儲數據,但它允許存儲的數據大小不同
條件:
- 列表中保存的單個數據小於64個字節
- 列表中數據個數少於512個
優點:
- 節省內存
- 支持不同類型數據的存儲
- 數據存儲在一片連續的內存空間,通過鍵來獲取值為列表類型的數據,讀取效率也非常高。
雙向循環鏈表:數據量比較大時,列表使用雙向循環鏈表實現
3、字典(hash):存儲一組
數據對,每個數據對又包含鍵值兩部分。
壓縮列表:數據集比較少的時候,采用壓縮列表
條件:
- 列表中保存的鍵和值的大小都小於64個字節
- 列表中鍵值對個數少於512個
散列表:數據量比較大,不滿足上述條件,使用散列表實現。
redis使用MurmurHash2這種運行速度快,隨機性好的哈希算法作為哈希函數,對於哈希沖突,redis使用鏈表法來解決。
redis支持散列表的動態擴容、縮絨。
4、集合(set):一種是基於有序數組,一種是基於散列表。
有序數組:
條件:
- 存儲的數據都是整數
- 存儲的數據元素個數不超過512個
散列表:
5、有序集合(sort set):
用來存儲一組數據,並且每個數據會附帶一個得分。通過得分的大小,我們將數據組織成跳表這樣的數據結構,以支持快速地按照得分值、得分區間獲取數據。
壓縮列表:數據集比較少的時候,采用壓縮列表
條件:
- 保存的數據小於64個字節
- 元素個數小於128個
跳表: