redis並沒有直接使用這些資料結構來實現鍵值對資料庫,而是基於這些資料結構建立了乙個物件系統,這個物件系統包含字串物件,列表物件,雜湊物件,集合物件和有序集合物件這五種型別的物件,每種物件都用到了至少一種我們前面所介紹的資料結構。
通過這五種不同型別的物件,redis可以在執行命令之前,根據物件的型別來判斷乙個物件是否可以執行給定的命令。使用物件的另乙個好處是,我們可以針對不同的使用場景,為物件設定多種不同的資料結構實現,從而優化物件在不同場景下的使用效率。
除此之外,redis的物件系統還實現了基於引用計數技術的記憶體**機制,當程式不再使用某個物件的時候,這個物件所占用的記憶體就會被釋放;另外,redis還通過引用計數技術實現了物件共享機制,這一機制可以在適當的條件下,通過多個資料庫鍵共享同乙個物件來節約記憶體。
每當我們建立一對鍵值對的時候我們最少要建立兩個物件,乙個鍵物件,乙個值物件。
型別:
型別常量
物件名稱
redis_string
字串物件
redis_list
列表物件
redis_hash
雜湊物件
redis_set
集合物件
redis_zset
有序集合物件
type命令在面對不同型別的值物件時產出的輸出
物件type屬性的值
type命令輸出
字串物件
redis_string
「string」
列表物件
redis_list
list
雜湊物件
redis_hash
hash
集合物件
redis_set
set有序集合物件
redis_zset
zset
編碼和底層實現:
下面這些是不同型別和編碼的物件
型別編碼
object encoding命令輸出
物件redis_string
redis_encoding_int
「int」
使用整數值實現的字串物件
redis_string
redis_encoding_embstr
「embstr」
使用embstr編碼的簡單動態字串實現的字串物件
redis_string
redis_encoding_raw
「raw」
使用簡單動態字串實現的字串物件
redis_list
redis_encoding_ziplist
「ziplist」
使用壓縮列表實現的列表物件
redis_list
redis_encoding_linkedlist
「linkedlist」
使用雙端鍊錶實現的列表物件
redis_hash
redis_encoding_ziplist
「ziplist」
使用壓縮列表實現的雜湊物件
redis_hash
redis_encoding_ht
「hashtable」
使用字典實現的雜湊物件
redis_set
redis_encoding_intset
「intset」
使用整數集合實現的集合物件
redis_set
redis_encoding_ht
「hashtable」
使用字典實現的集合物件
redis_zset
redis_encoding_ziplist
「ziplist」
使用壓縮列表實現的有序集合物件
redis_zset
redis_encoding_skiplist
「skiplist」
使用跳躍表和字典實現的有序集合物件
1、字串物件編碼選擇
embstr(專門用於儲存短字串的一種優化編碼方式)
2、embstr比raw方式的優勢
3、long double 型別浮點數儲存(embstr或raw)
4、編碼轉換
5、字串物件是redis五中型別物件中唯一會被其他四種型別物件巢狀的物件
1、列表物件編碼可以是ziplist或linkedlist
2、編碼轉換(限制條件的上限值可以修改)
1、雜湊物件的編碼可以是ziplist或hashtable
2、ziplist編碼的雜湊物件使用壓縮列表作為底層實現:
3、hashtable編碼的雜湊物件使用字典作為底層實現:
4、編碼轉換(限制條件的上限值可以修改)
1、有序集合的編碼可以是ziplist或skiplist
2、ziplist編碼的壓縮列表物件使用壓縮列表作為底層實現
3、skiplist編碼的有序集合物件使用zset結構作為底層實現
4、編碼轉換(限制條件的上限值可以修改)
1、可以對任何型別的鍵執行的命令:del expire rename type object等
2、只能對特定型別的鍵執行的命令:
雜湊鍵:hdel hset hget hlen等
列表鍵:rpush lpop linsert llen等
集合鍵:sadd spop sinter scard等
有序集合鍵:zadd zcard zrank zscore等
3、型別特定命令在執行之前會先檢查輸入鍵的型別是否正確,是通過redisobject結構的type屬性來實現的
4、多型命令實現:根據值物件的型別來判斷鍵是否能夠執行指定命令,根據值物件的編碼方式,選擇正確的命令實現**來執行命令
redis在自己的物件系統中構建了乙個引用計數計數實現記憶體**機制,程式可以通過跟蹤物件的引用計數資訊,在適當的時候自動釋放物件並進行記憶體**
1、物件的引用計數屬性還帶有物件共享的作用
2、讓多個鍵共享同乙個值物件需要執行:將資料庫鍵的值指標指向乙個現有的值物件;將被共享的值物件的引用計數增加一
3、儘管共享更複雜的物件可以節約更多的記憶體,但受到cpu時間的限制,redis只對包含整數值得字串物件進行共享(完全相同的才能共享,驗證相同時的複雜度決定的)
4、redis會共享值為0~9999的字串物件
2、object idletime命令可以列印給定鍵的空轉時長=當前時間-lru(該命令本身不會更新lru值)
3、超過maxmemory選項上限,在有些**記憶體演算法下,空轉時長較高的那部分鍵會優先被伺服器釋放
Redis的設計與原理 一
本章講解的是redis當初設計的資料結構和內部物件的知識點 1.動態字串 雖然redis使用的是ansi c所編寫但是內部使用的字串並沒有使用c中的字串,而是使用了一種名為簡單動態字串 dynarmic string,sds 的抽象型別作為它的預設字串型別 struct sdshdrsds就是上面這...
Redis的設計與原理(七)
本章將會寫單獨乙個redis資料的實現,比如伺服器儲存資料庫的方法,客戶端切換資料的方法,資料庫儲存鍵值對的方法,以及針對資料庫的新增,刪除,檢視,更新操作的實現方法等。在初始化伺服器時,程式會根據伺服器狀態的dbnum屬性來決定應該決定應該建立多少個資料庫 預設情況下,該選項的值為16,所以red...
Redis系列 六 SortedSets設計技巧
閱讀目錄 介紹 score佔位 更多位資訊 總結redis sorted sets是類似redis sets資料結構,不允許重複項的string集合。不同的是sorted sets中的每個成員都分配了乙個分數值 score 它用於在sorted sets中進行成員排序,從最小值到最大值。sorted...