泰達(dá)建設(shè)集團(tuán)網(wǎng)站廈門最快seo
Redis存儲模型
每次在Redis數(shù)據(jù)庫中創(chuàng)建一個鍵值對時,至少會創(chuàng)建兩個對象,一個是鍵對象,一個是值對象,而Redis中的每個對象都是由 redisObject 結(jié)構(gòu)來表示.redisObject的結(jié)構(gòu)與對象類型、內(nèi)存編碼、內(nèi)存回收、共享對象都有關(guān)系,一個redisObject對象的大小為16字節(jié):4bit+4bit+24bit+4Byte+8Byte=16Byte。
typedef struct redisObject{unsigned type:4; //對象類型unsigned encoding:4; //內(nèi)部編碼unsigned lru: REDIS_LRU_BITS; //記錄最后一次被程序訪問的時間 lru time (relative to server.lruLock) 計(jì)數(shù)時鐘int refcount; //引用計(jì)數(shù)器void *ptr; //指向底層數(shù)據(jù)結(jié)構(gòu)的指針
}robj
-
type對象類型:type字段表示對象的數(shù)據(jù)類型,占據(jù)4個bit,當(dāng)我們執(zhí)行type object指令時可以查看相應(yīng)的類型;
-
encoding內(nèi)部編碼類型:encoding表示對象的內(nèi)部編碼,占4個bit。redis支持的各種數(shù)據(jù)類型,每種至少存在兩種內(nèi)部編碼,比如string存在int、embstr、raw三種類型編碼,list存在ziplist、linkedlist兩種類型編碼。每種類型存在多種不同編碼的好處在于可以根據(jù)不同的使用場景自動切換內(nèi)部不同的編碼來提高效率,大大的提高了靈活性,也做到了解耦用戶和底層編碼優(yōu)化。我們可以通