一、RedisObject結構
### --- RedisObject結構
~~~ Value是一個對象
~~~ 包含字元串對象,清單對象,哈希對象,集合對象和有序集合對象
### --- 結構資訊概覽
typedef struct redisObject {
unsigned type:4; # 類型 五種對象類型
unsigned encoding:4; # 編碼
void *ptr; # 指向底層實作資料結構的指針
//...
int refcount; # 引用計數
//...
unsigned lru:LRU_BITS; # LRU_BITS為24bit 記錄最後一次被指令程式通路的時間
//...
}robj;
二、結構資訊概覽
### --- 4位type
~~~ type 字段表示對象的類型,占 4 位;
~~~ REDIS_STRING(字元串)、REDIS_LIST (清單)、REDIS_HASH(哈希)、
~~~ REDIS_SET(集合)、REDIS_ZSET(有序集合)。
~~~ # 當我們執行 type 指令時,便是通過讀取 RedisObject 的 type 字段獲得對象的類型
127.0.0.1:6379> type a1
string
### --- 4位encoding
~~~ encoding 表示對象的内部編碼,占 4 位
~~~ 每個對象有不同的實作編碼
~~~ Redis 可以根據不同的使用場景來為對象設定不同的編碼,大大提高了 Redis 的靈活性和效率。
~~~ 通過 object encoding 指令,可以檢視對象采用的編碼方式
127.0.0.1:6379> object encoding a1
"int"
### --- 24位LRU
~~~ lru 記錄的是對象最後一次被指令程式通路的時間,( 4.0 版本占 24 位,2.6 版本占 22 位)。
~~~ 高16位存儲一個分鐘數級别的時間戳,低8位存儲通路計數(lfu : 最近通路次數)
lru----> 高16位: 最後被通路的時間
lfu----->低8位:最近通路次數
### --- refcount
~~~ refcount 記錄的是該對象被引用的次數,類型為整型。
~~~ refcount 的作用,主要在于對象的引用計數和記憶體回收。
~~~ 當對象的refcount>1時,稱為共享對象
~~~ Redis 為了節省記憶體,當有一些對象重複出現時,
~~~ 新的程式不會建立新的對象而是仍然使用原來的對象。
### --- ptr
~~~ ptr 指針指向具體的資料,比如:set hello world,ptr 指向包含字元串 world 的 SDS。