Redis源碼研究之redisObject

本文主要說(shuō)明Redis key-value結(jié)構(gòu)中封裝五種value的redisObject結(jié)構(gòu)辩尊。

I洛勉、上帝視角

redisObject結(jié)構(gòu)主要說(shuō)明value對(duì)象的底層編碼方式遮斥,以及實(shí)際指向等內(nèi)容:

/*src/redis.h/redisObject */
typedef struct redisObject {
    // 剛剛好32 bits
    // 對(duì)象的類(lèi)型茬底,字符串/列表/集合/哈希表
    unsigned type:4;
    // 未使用的兩個(gè)位
    unsigned notused:2; /* Not used */

    // 編碼的方式征绎,Redis 為了節(jié)省空間占键,提供多種方式來(lái)保存一個(gè)數(shù)據(jù)
    // 譬如:“123456789” 會(huì)被存儲(chǔ)為整數(shù)123456789
    unsigned encoding:4;

    // 當(dāng)內(nèi)存緊張昔善,淘汰數(shù)據(jù)的時(shí)候用到
    unsigned lru:22; /* lru time (relative to server.lruclock) */

    // 引用計(jì)數(shù)
    int refcount;

    // 數(shù)據(jù)指針,指向真正的數(shù)據(jù)
    void *ptr;
} robj;  

下面對(duì)以上屬性進(jìn)行一一說(shuō)明畔乙。

II君仆、type屬性

redisObject數(shù)據(jù)結(jié)構(gòu)將對(duì)象屬性與對(duì)象的數(shù)據(jù)分開(kāi),這樣做有良好的特性牲距,可以先根據(jù)屬性進(jìn)行檢查判斷等操作返咱,這些都不需要直接訪問(wèn)數(shù)據(jù)本身。

其中type屬相標(biāo)記了value對(duì)象的數(shù)據(jù)類(lèi)型:

/* Object types */
#define REDIS_STRING 0
#define REDIS_LIST 1
#define REDIS_SET 2
#define REDIS_ZSET 3
#define REDIS_HASH 4  

III牍鞠、encoding屬性

Redis為優(yōu)化內(nèi)存咖摹,對(duì)每種type類(lèi)型都至少會(huì)有兩種底層實(shí)現(xiàn)方式,如zset就可以是ziplist與skiplist难述。

redisObject結(jié)構(gòu)中的encoding屬性就標(biāo)記了對(duì)象使用的是那種底層數(shù)據(jù)結(jié)構(gòu):

/* Objects encoding. Some kind of objects like Strings and Hashes can be
* internally represented in multiple ways. The 'encoding' field of the object
* is set to one of this fields for this object. */
#define REDIS_ENCODING_RAW 0 /* Raw representation */
#define REDIS_ENCODING_INT 1 /* Encoded as integer */
#define REDIS_ENCODING_HT 2 /* Encoded as hash table */
#define REDIS_ENCODING_ZIPMAP 3 /* Encoded as zipmap萤晴,已經(jīng)淘汰 */
#define REDIS_ENCODING_LINKEDLIST 4 /* Encoded as regular linked list */
#define REDIS_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define REDIS_ENCODING_INTSET 6 /* Encoded as intset */
#define REDIS_ENCODING_SKIPLIST 7 /* Encoded as skiplist */    

IV、refcount屬性

Redis中為了更好的優(yōu)化內(nèi)存空間胁后,對(duì)數(shù)字字符串進(jìn)行了共享內(nèi)存的操作店读,并以引用計(jì)數(shù)方式進(jìn)行管理。

下面的函數(shù)為增加引用及減少應(yīng)用的操作:

// 增加 Redis 對(duì)象引用
void incrRefCount(robj *o) {
    o->refcount++;
 }
// 減少 Redis 對(duì)象引用攀芯。需要判斷是否需要進(jìn)行析構(gòu)
void decrRefCount(robj *o) {
    if (o->refcount <= 0) redisPanic("decrRefCount against refcount <= 0");
    // 如果取消的是最后一個(gè)引用屯断,則釋放資源
    if (o->refcount == 1) {
    // 不同數(shù)據(jù)類(lèi)型,銷(xiāo)毀操作不同
    switch(o->type) {
        case REDIS_STRING: freeStringObject(o); break;
        case REDIS_LIST: freeListObject(o); break;
        case REDIS_SET: freeSetObject(o); break;
        case REDIS_ZSET: freeZsetObject(o); break;
        case REDIS_HASH: freeHashObject(o); break;
        default: redisPanic("Unknown object type"); break;
    }
    zfree(o);
  } else {
      o->refcount--;
  }
}  

對(duì)于這里的引用計(jì)數(shù)來(lái)說(shuō),因?yàn)镽edis是單線程工作模式的裹纳,所以引用計(jì)數(shù)的增加和減少不比保證原子性择葡。

V、lru屬性

Redis對(duì)數(shù)據(jù)集占用內(nèi)存的大小由周期性的計(jì)算剃氧,當(dāng)超出限制時(shí)敏储,會(huì)淘汰超時(shí)的數(shù)據(jù)。即淘汰的標(biāo)準(zhǔn)為:oversize & overtime朋鞍。

【參考】
[1] 《Redis設(shè)計(jì)與實(shí)現(xiàn)》
[2] 《Redis源碼日志》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末已添,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子滥酥,更是在濱河造成了極大的恐慌更舞,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坎吻,死亡現(xiàn)場(chǎng)離奇詭異缆蝉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瘦真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)刊头,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诸尽,你說(shuō)我怎么就攤上這事原杂。” “怎么了您机?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵穿肄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我际看,道長(zhǎng)咸产,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任仲闽,我火速辦了婚禮锐朴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔼囊。我一直安慰自己焚志,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布畏鼓。 她就那樣靜靜地躺著酱酬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪云矫。 梳的紋絲不亂的頭發(fā)上膳沽,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼挑社。 笑死陨界,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痛阻。 我是一名探鬼主播菌瘪,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阱当!你這毒婦竟也來(lái)了俏扩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弊添,失蹤者是張志新(化名)和其女友劉穎录淡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體油坝,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫉戚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澈圈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彼水。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖极舔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情链瓦,我是刑警寧澤拆魏,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站慈俯,受9級(jí)特大地震影響渤刃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贴膘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一卖子、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刑峡,春花似錦洋闽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至宫患,卻和暖如春刊懈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工虚汛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匾浪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓卷哩,卻偏偏與公主長(zhǎng)得像蛋辈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子殉疼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理梯浪,服務(wù)發(fā)現(xiàn),斷路器瓢娜,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,321評(píng)論 8 265
  • 記事本 拼多多退款要找人工服務(wù)(切記) 查看物流---投訴物流 2012.2.6星期二 這幾天就是心情不好挂洛,就知道...
    土五_cff0閱讀 247評(píng)論 0 0
  • 與創(chuàng)源工具的結(jié)緣:一見(jiàn)鐘情 第一次見(jiàn)到創(chuàng)源工具虏劲,是看到導(dǎo)師班的同學(xué)基本上人手一個(gè)護(hù)衛(wèi)墜和一個(gè)光墜。那時(shí)候我并不知道...
    普靖確涅桑姆閱讀 2,075評(píng)論 1 6
  • 親愛(ài)的婆婆褒颈,今天回到家時(shí)柒巫,你正在切著大塊的豬肉準(zhǔn)備做香腸,你做的香腸一直就特別好吃谷丸,這兩年帶小寶堡掏,過(guò)年時(shí)都...
    周小末_0700閱讀 169評(píng)論 0 3