天天看點

|NO.Z.00057|——————————|BigDataEnd|——|Hadoop&Redis.V02|——|Redis.v02|RedisDB結構.v02|

一、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。