Redis深入之對象,redis深入
Redis對象系統
前面介紹了Redis用到的所有主要資料結構,如簡單動態字串(SDS)、雙端鏈表、字典、壓縮列表、整數集合等
Redis並沒有直接使用這些資料結構來實現鍵值對資料庫,而是基於這些資料結構建立了一個對象系統,這個系統包含字串對象、列表對象、雜湊對象、集合對象和有序集合對象這五種類型的對象,每種對象都用到了至少一種我們前面所介紹的資料結構。
Redis對象系統還實現了記憶體回收機制、對象共用機制。Redis的對象帶有訪問時間記錄資訊,該資訊可以用於計算資料庫鍵的空轉時間長度,空轉時間長度較大的那些鍵可能會優先被伺服器刪除。
SET命令建立一個新的鍵值對,SET msg “hello world”
包含兩個對象,鍵對象和值對象,每個對象都由一個redis對象結構表示,有3個屬性和儲存資料有關,type類型,encoding:編碼和ptr:指向底層實現資料結構的指標。
鍵總是一個字串對象,值可以是字串對象、列表對象、雜湊對象、集合對象或有序集合對象中的一種。
Redis > SET msg“hello world” 字串對象
Redis >RPUSHnumbers 1 3 5 列表對象
Redis> HMSETprofile name Tom age 25 career Programmer 雜湊
Redis>SADDfruits apple banana cherry 集合
Redis>ZADDprice 8.5 apple 5.0 banana 6.0 cherry 有序集合
使用OBJECT ENCODING命令可以查看一個資料庫鍵的值對象的編碼
String——INT整形、RAW簡單動態字串
LIST——ZIPLIST壓縮列表、LINKEDLIST雙端鏈表
HASH——ZIPLIST壓縮列表、HT字典
SET——INTSET整數集合、HT字典
ZSET——ZIPLIST壓縮列表、SKIPLIST跳躍表和字典
通過encoding屬性來設定對象所使用的編碼,而不是為特定類型的對象關聯一種固定的編碼,極大地提升了Redis的靈活性和效率,因為Redis可以根據不同的使用情境來為一個對象設定不同的編碼,從而最佳化對象在某一情境下的效率。
比如:在列表對象包含的元素比較少時,Redis使用壓縮列表作為列表對象的底層實現:
因為壓縮列表比雙端鏈表更節約記憶體,並且在元素數量較少時,在記憶體中以連續塊方式儲存的壓縮列表比起雙端鏈表可以更快地載入到緩衝中。
隨著列表對象包含的元素越來越多,使用壓縮列表來儲存元素的優勢逐漸消失,對象就會將底層實現從壓縮列錶轉向功能更強、也更適合儲存大量元素的雙端鏈表上面。