redis 內(nèi)部數(shù)據(jù)結(jié)構(gòu)(1.7)-對象

Redis 使用對象來表示數(shù)據(jù)庫中的鍵和值趟薄, 每次當(dāng)我們在 Redis 的數(shù)據(jù)庫中新創(chuàng)建一個鍵值對時羡铲, 我們至少會創(chuàng)建兩個對象贾费, 一個對象用作鍵值對的鍵(鍵對象)导犹, 另一個對象用作鍵值對的值(值對象)节猿。

舉個例子太雨, 以下 SET 命令在數(shù)據(jù)庫中創(chuàng)建了一個新的鍵值對兜看, 其中鍵值對的鍵是一個包含了字符串值 "msg" 的對象葫哗, 而鍵值對的值則是一個包含了字符串值 "hello world" 的對象:

redis> SET msg "hello world"
OK

Redis 中的每個對象都由一個 redisObject 結(jié)構(gòu)表示, 該結(jié)構(gòu)中和保存數(shù)據(jù)有關(guān)的三個屬性分別是 type 屬性、 encoding 屬性和 ptr 屬性:

typedef struct redisObject {

    // 類型
    unsigned type:4;

    // 編碼
    unsigned encoding:4;

    // 指向底層實現(xiàn)數(shù)據(jù)結(jié)構(gòu)的指針
    void *ptr;

    // ...

} robj;

type 可能的取值情況:
REDIS_STRING 字符串對象
REDIS_LIST 列表對象
REDIS_HASH 哈希對象
REDIS_SET 集合對象
REDIS_ZSET 有序集合對象

對于 Redis 數(shù)據(jù)庫保存的鍵值對來說毒涧, 鍵總是一個字符串對象捡偏, 而值則可以是字符串對象彤避、列表對象模孩、哈希對象、集合對象或者有序集合對象的其中一種数焊, 因此:

  • 當(dāng)我們稱呼一個數(shù)據(jù)庫鍵為“字符串鍵”時干厚, 我們指的是“這個數(shù)據(jù)庫鍵所對應(yīng)的值為字符串對象”芹助;
  • 當(dāng)我們稱呼一個鍵為“列表鍵”時饵蒂, 我們指的是“這個數(shù)據(jù)庫鍵所對應(yīng)的值為列表對象”慰照,

TYPE 命令的實現(xiàn)方式也與此類似墅垮, 當(dāng)我們對一個數(shù)據(jù)庫鍵執(zhí)行 TYPE 命令時峡钓, 命令返回的結(jié)果為數(shù)據(jù)庫鍵對應(yīng)的值的類型捧灰, 而不是鍵對象的類型煌寇。

對象 對象 type 屬性的值 TYPE 命令的輸出
字符串對象 REDIS_STRING "string"
列表對象 REDIS_LIST "list"
哈希對象 REDIS_HASH "hash"
集合對象 REDIS_SET "set"
有序集合對象 REDIS_ZSET "zset"

底層實現(xiàn)的編碼

encoding 屬性記錄了對象所使用的編碼击纬, 也即是說這個對象使用了什么數(shù)據(jù)結(jié)構(gòu)作為對象的底層實現(xiàn)肯腕, 這個屬性的值可以是表列出的常量的其中一個捷兰。

編碼常量 編碼所對應(yīng)的底層數(shù)據(jù)結(jié)構(gòu)
REDIS_ENCODING_INT long 類型的整數(shù)
REDIS_ENCODING_EMBSTR embstr 編碼的簡單動態(tài)字符串
REDIS_ENCODING_RAW 簡單動態(tài)字符串
REDIS_ENCODING_HT 字典
REDIS_ENCODING_LINKEDLIST 雙端鏈表
REDIS_ENCODING_ZIPLIST 壓縮列表
REDIS_ENCODING_INTSET 整數(shù)集合
REDIS_ENCODING_SKIPLIST 跳躍表和字典

不同類型和編碼的對象
每種type對應(yīng)兩種編碼

type encoding 對象
REDIS_STRING REDIS_ENCODING_INT 使用整數(shù)值實現(xiàn)的字符串對象
REDIS_STRING REDIS_ENCODING_EMBSTR 使用 embstr 編碼的簡單動態(tài)字符串實現(xiàn)的字符串對象秽浇。
REDIS_STRING REDIS_ENCODING_RAW 使用簡單動態(tài)字符串實現(xiàn)的字符串對象搅轿。
REDIS_LIST REDIS_ENCODING_ZIPLIST 使用壓縮列表實現(xiàn)的列表對象雀鹃。
REDIS_LIST REDIS_ENCODING_LINKEDLIST 使用雙端鏈表實現(xiàn)的列表對象。
REDIS_HASH REDIS_ENCODING_ZIPLIST 使用壓縮列表實現(xiàn)的哈希對象焙畔。
REDIS_HASH REDIS_ENCODING_HT 使用字典實現(xiàn)的哈希對象留搔。
REDIS_SET REDIS_ENCODING_INTSET 使用整數(shù)集合實現(xiàn)的集合對象。
REDIS_SET REDIS_ENCODING_HT 使用字典實現(xiàn)的集合對象薄声。
REDIS_ZSET REDIS_ENCODING_ZIPLIST 使用壓縮列表實現(xiàn)的有序集合對象抱婉。
REDIS_ZSET REDIS_ENCODING_SKIPLIST 使用跳躍表和字典實現(xiàn)的有序集合對象。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌破讨,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異识虚,居然都是意外死亡铭腕,警方通過查閱死者的電腦和手機怀挠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來一忱,“玉大人,你說我怎么就攤上這事〗妓遥” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我逊移,道長巷嚣,這世上最難降的妖魔是什么涤姊? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任壁酬,我火速辦了婚禮颜武,結(jié)果婚禮上这吻,老公的妹妹穿的比我還像新娘橘原。我一直安慰自己芋酌,他們只是感情好堵腹,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般耍鬓。 火紅的嫁衣襯著肌膚如雪阔籽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天牲蜀,我揣著相機與錄音笆制,去河邊找鬼。 笑死涣达,一個胖子當(dāng)著我的面吹牛在辆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播度苔,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匆篓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了寇窑?” 一聲冷哼從身側(cè)響起鸦概,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甩骏,沒想到半個月后窗市,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡饮笛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年咨察,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片福青。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡摄狱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出素跺,到底是詐尸還是另有隱情二蓝,我是刑警寧澤誉券,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布指厌,位于F島的核電站,受9級特大地震影響踊跟,放射性物質(zhì)發(fā)生泄漏踩验。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一商玫、第九天 我趴在偏房一處隱蔽的房頂上張望箕憾。 院中可真熱鬧,春花似錦拳昌、人聲如沸袭异。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽御铃。三九已至碴里,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間上真,已是汗流浹背咬腋。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工睡互, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留根竿,地道東北人就珠。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓九巡,卻偏偏與公主長得像蹂季,于是被迫代替她去往敵國和親偿洁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

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