redis物件系統,包含字串物件,列表物件,雜湊物件,集合物件和有序集合物件這五種型別的物件。通過五種不同型別的物件,redis可以在執行命令之前,根據物件的型別來判斷乙個物件是否可以執行給定的命令。使用物件的另乙個好處是,我們可以針對不同的使用場景,為物件設定多種不同的資料結構實現,優化物件在不同場景下的使用效率。
redis的物件系統還實現了基於引用計數技術的**記憶體機制,當程式不再使用某個物件的時候,這個物件所占用的的記憶體會被自動釋放。redis還通過引用計數技術實現了物件共享機制,在適當的條件下,通過多個資料庫鍵共享統一物件來節約記憶體。redis物件帶有訪問時間記錄,用於計算資料庫鍵的空轉時長,在伺服器啟用了maxmemory功能的情況下,空轉時長較大的鍵可能優先被伺服器刪除。
redis中物件由redisobject結構表示
/*src/redis.h/redisobject */
typedef struct redisobject robj;
對於redis資料庫儲存的鍵值對來說,鍵總是乙個字串物件,而值可以是字串物件,列表物件,雜湊物件,集合物件或者有序集合物件的其中一種。
當對乙個資料庫鍵執行type命令時,命令返回的結果是資料庫鍵對應的值物件的型別,而不是鍵物件的型別:
redisobject物件中的ptr指標指向物件的底層實現按資料結構,而這些資料結構由物件的encoding屬性決定。encoding屬性記錄了物件所使用發編碼,即物件使用了什麼資料結構作為底層實現。
每種型別的物件都至少使用了兩種不同的編碼。
備註:3.2版本後,redis_list增加了一種編碼:redis_encoding_qicklist,是壓縮列表和雙端列表的結合。
使用object engcoding命令可以檢視乙個資料庫鍵的值物件的編碼:
通過encoding屬性來設定物件所使用的編碼,而不是為特定型別的物件關聯一種固定的編碼,極大地替身了redis的靈活性和效率,因為redis可以根據不同的使用場景來為物件設定乙個不同的編碼,從而優化物件在某一場景下的效率。
比如:在列表物件包含的元素比較少時,redis使用壓縮列表作為列表物件的底層實現:
接下來會分析redis的五種物件,以及底層實現結構。
字串物件的編碼可以是int,raw或者embstr。
如果乙個字串物件儲存的是整數值,並且這個整數值可以用long型別來表示,那麼字串物件會將整數值儲存在字串物件結構的ptr屬性裡面(將void*轉換成long),並將字串物件的編碼設定為int
如果字串物件儲存的是乙個字串,並且這個字串的長度大於44位元組,那麼字串物件將使用乙個簡單動態字串(sds)來儲存,並將物件的編碼設定為raw。
如果字串物件儲存的是乙個字串,並且這個字串的長度小於等於44位元組,那麼字串物件將使用embstr編碼的方式來儲存這個字串值。
embstr編碼是專門用來儲存短字串的一種優化編碼方式,和raw一樣都是使用redisobject和sdshdr結構來表示字串物件,但是raw編碼會呼叫兩次記憶體分配函式來分別建立redisobject結構和sdshdr結構,而embstr編碼通過呼叫一次記憶體分配函式來分配一塊連續的空間,空間中依次包含redisobject和sdshdr兩個結構。
Redis物件 Redis物件系統簡介
最新 redis記憶體 三個重要的緩衝區 最新 redis記憶體 記憶體消耗 記憶體都去哪了?最新 redis持久化 如何選擇合適的持久化方式 最新 redis持久化 aof日誌 之前幾篇文章,簡單介紹 redis用到的所有主要資料結構,簡單動態字串 sds 雙端鍊錶 字典 壓縮列表 整數集合 跳躍...
Redis物件系統
在上一節學習redis中的六種基礎資料結構,但在redis中並沒有直接使用以上的資料結構實現鍵值對資料庫,而是基於這些資料結構構建了乙個物件系統 字串物件 string 列表物件 list 雜湊物件 hash 集合物件 set 和有序集合物件 zset 對於redis資料庫,鍵總是乙個字串物件,而值...
Redis的物件系統
下面的內容來自 redis設計與實現 這本書。redis內部自己實現的主要資料結構有簡單動態字串 sds 雙端鍊錶 字典 跳躍表 整數集合和壓縮列表。redis並沒有直接使用這些資料結構來實現鍵值對資料庫,而是基於這些資料結構建立了乙個物件系統,這個系統包含字串物件 列表物件 雜湊物件 集合物件和有...