Redis的設計與原理(六)

2021-09-25 07:14:40 字數 3245 閱讀 2727

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...