8.1 對象

Redis用到的所有主要數(shù)據(jù)結(jié)構(gòu)蚜印,簡單動態(tài)字符串(SDS)、雙端列表留量、字典窄赋、跳躍表、整數(shù)集合楼熄、壓縮列表忆绰。
Redis并沒有直接使用這些數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)鍵值對的數(shù)據(jù)庫,而是基于這些數(shù)據(jù)結(jié)構(gòu)創(chuàng)建了一個對象西永可岂,這個系統(tǒng)包含字符串對象较木、列表對象、哈希對象青柄、集合對象和有序集合對象這五種類型的對象伐债,每中對象都用到了至少一種我們前面所介紹的數(shù)據(jù)結(jié)構(gòu)。
通過這五種不同類型的對象致开,Redis可以在執(zhí)行命令之前峰锁,根據(jù)對象的類型來判斷一個對象是否可以執(zhí)行給定的命令。使用對象的一個好處是双戳,我們可以針對不同的使用場景虹蒋,為對象設置多種不同的數(shù)據(jù)結(jié)構(gòu)實現(xiàn),從而優(yōu)化對象在不同場景下的使用效率。
Redis的對象系統(tǒng)還實現(xiàn)了基于引用計數(shù)技術(shù)的內(nèi)存回收機制魄衅,當程序不在使用某個對象的時候峭竣,這個對象所占用的內(nèi)存就會被自動釋放;另外晃虫,Redis還通過引用計數(shù)技術(shù)實現(xiàn)了對象的共享機制皆撩,這一機制可以在適當?shù)臈l件下,通過讓多個數(shù)據(jù)庫鍵共享用一個對象來節(jié)約內(nèi)次哲银。
最后扛吞,Redis的對象帶有訪問時間記錄信息,該信息可以用于計算數(shù)據(jù)庫鍵的空轉(zhuǎn)時長荆责,在服務器啟用了maxmemory功能的情況下滥比,空轉(zhuǎn)時長較大的那些鍵可能會優(yōu)先被服務器刪除。

8.1 對象的類型與編碼

Redis使用對象來表示數(shù)據(jù)庫中的鍵和值做院,每次當我們在Redis的數(shù)據(jù)庫中新創(chuàng)建一個鍵值對盲泛,我們至少創(chuàng)建兩個對象,一個對象用作鍵值對的鍵键耕,另一個對象用作鍵值對的值查乒。
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;
}

8.1.1 類型

對象的type屬性記錄了對象的類型,這個屬性的值如下

類型常量 對象的名稱
REDIS_STRING 字符串對象
REDIS_LIST 列表對象
REDIS_HASH 哈希對象
REDIS_SET 集合對象
REDIS_ZSET 有序結(jié)合對象

對于Redis數(shù)據(jù)庫保存的鍵值對來說由境,鍵總是一個字符串對象棚亩,而值則可以是String, List, Hash, Set, ZSet對象中的其中一個。

TYPE命令:當我們對一個數(shù)據(jù)庫鍵執(zhí)行TYPE命令時虏杰,命令返回的結(jié)果為數(shù)據(jù)庫鍵對應的值對象的類型讥蟆,而不是鍵對象的類型

8.1.2 編碼和底層實現(xiàn)

對象的ptr指針指向?qū)ο蟮牡讓訉崿F(xiàn)數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)由對象的encoding屬性決定纺阔。
encoding屬性記錄了對象所使用的編碼瘸彤,也就是說這個對象上用了什么數(shù)據(jù)結(jié)構(gòu)作為對象的底層實現(xiàn),屬性如下:

編碼常量 編碼所對應的底層數(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 跳躍表

每種類型的對象都至少使用了兩種不同的編碼

類型 編碼 對象
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)的有序集合對象

OBJECT ENCODING命令:可以查看一個數(shù)據(jù)庫鍵的值對象的編碼:

通過encoding屬性來設定對象所使用的編碼笛钝。而不是為特定類型的對象關(guān)聯(lián)一種固定的編碼质况,極大地提升了Redis的靈活性,因為Redis可以根據(jù)不同的使用場景來為一個對象設置不同的編碼玻靡,從而優(yōu)化對象在某一場景下的效率结榄。

8.1.3 Key(鍵)命令

1. DEL
DEL key [key ...]

刪除給定的一個或多個key
不存在的key會被忽略

2. DUMP
DUMP key

序列化給定key,并返回被序列化的值囤捻,使用RESTORE命令可以將這個值反序列化為Redis
序列化生成的值有以下幾個特點:

  • 帶有64為的校驗和臼朗,用于檢測錯誤,RESTORE在進行反序列化之前會先檢查校驗和征绸。
  • 值的編碼格式和RDB文件保持一致贿堰。
  • RDB版本會編碼在序列化值當眾微猖,如果因為Redis的版本不同造成RDB格式不兼容簿寂,那么Redis會拒絕為這個值進行反序列操作佳头。
    序列化的值不包括任何生存時間信息氮惯。
3. EXISTS
EXISTS key

檢查給定的key是否存在

4. EXPIRE
EXPIRE key seconds

為給定的key設置生存時間襟士,當key過期時卿嘲,會被自動刪除慷嗜。

5. EXPIREAT
EXPIREAT key timestamp

EXPIREAT的作用和EXPIRE類似淀弹,都用于為key設置生存時間
不同在于EXPIREAT命令接受的時間參數(shù)是UNIX時間戳

6. KEYS
KEYS pattern

查詢所有符合給定模式patternkey
KEYS * 匹配數(shù)據(jù)庫中所有的key
KEYS h?llo匹配hello, hallohxllo
KEYS h*llo匹配hllo, heeeeello
KEYS h[ae]llo匹配hellohallo,但不匹配hillo庆械。

7. MIGRATE
MIGRATE host port key destination-db timeout [COPY] [REPLACE]

key原子性地從當前實例傳送到目標實例的指定數(shù)據(jù)庫上薇溃,一旦傳送成功,key保證會出現(xiàn)在目標實例上缭乘,而當前實例上的key會被刪除沐序。
這個命令是一個原子操作,它在執(zhí)行的時候會阻塞進行遷移的兩個實例堕绩,直到以下任意結(jié)果發(fā)生:遷移成功策幼,遷移失敗,等待超時奴紧。
命令的內(nèi)部實現(xiàn)是這樣的:它在當前實例對給定key執(zhí)行DUMP命令 特姐,將它序列化,然后傳送到目標實例黍氮,目標實例再使用RESTORE對數(shù)據(jù)進行反序列化唐含,并將反序列化所得的數(shù)據(jù)添加到數(shù)據(jù)庫中;當前實例就像目標實例的客戶端那樣沫浆,只要看到RESTORE命令返回OK捷枯,它就會調(diào)用DEL刪除自己數(shù)據(jù)庫上的key
timeout參數(shù)以毫秒為格式专执,指定當前實例和目標實例進行溝通的最大間隔時間淮捆。這說明操作并不一定要在timeout毫秒內(nèi)完成,只是說數(shù)據(jù)傳送的時間不能超過這個timeout數(shù)本股。
MIGRATE命令需要在給定的時間規(guī)定內(nèi)完成IO操作攀痊。如果在傳送數(shù)據(jù)時發(fā)生IO錯誤,或者達到了超時時間拄显,那么命令會停止執(zhí)行蚕苇,并返回一個特殊的錯誤:IOERR
IOERR出現(xiàn)時凿叠,有以下兩種可能:

  • key可能存在于兩個實例
  • key可能只存在于當前實例
    唯一不可能發(fā)生的情況就是丟失key涩笤,因此嚼吞,如果一個客戶端執(zhí)行MIGRATE命令,并且不幸遇上IOERR錯誤蹬碧,那么這個客戶端唯一要做的就是檢查自己數(shù)據(jù)庫上的key是否已經(jīng)被正確地刪除舱禽。
  • COPY:不移除源實例上的key
  • REPLACE:替換目標實例上已存在的key恩沽。
8. MOVE
MOVE key db

將當前數(shù)據(jù)庫的key移動到給定的數(shù)據(jù)庫db當中誊稚。
如果當前數(shù)據(jù)庫(源數(shù)據(jù)庫)和給定數(shù)據(jù)庫(目標數(shù)據(jù)庫)有相同名字的給定key,或者key不存在于當前數(shù)據(jù)庫罗心,那么MOVE沒有任何效果里伯。
因此,也可以利用這一特性渤闷,將MOVE當作鎖(locking)原語(primitive)疾瓮。

9. OBJECT
OBJECT subcommand [arguments [arguments]]

OBJECT命令允許從內(nèi)部察看給定keyRedis對象。
OBJECT命令有多個子命令:
OBJECT REFCOUNT <key>返回給定key引用所儲存的值的次數(shù)飒箭。此命令主要用于除錯狼电。
OBJECT ENCODING <key>返回給定key鎖儲存的值所使用的內(nèi)部表示(representation)。
OBJECT IDLETIME <key>返回給定key自儲存以來的空閑時間(idle弦蹂, 沒有被讀取也沒有被寫入)肩碟,以秒為單位。

10. PERSIST
PERSIST key

移除給定key的生存時間凸椿,將這個key從『易失的』(帶生存時間key)轉(zhuǎn)換成『持久的』(一個不帶生存時間削祈、永不過期的key)。

11. PEXPIRE
PEXPIRE key milliseconds

這個命令和EXPIRE命令的作用類似脑漫,但是它以毫秒為單位設置key的生存時間髓抑,而不像EXPIRE命令那樣,以秒為單位窿撬。

12. PEXPIREAT
PEXPIREAT key milliseconds-timestamp

這個命令和EXPIREAT命令類似,但它以毫秒為單位設置key的過期unix時間戳叙凡,而不是像EXPIREAT那樣劈伴,以秒為單位。

13. PTTL
PTTL key

這個命令類似于TTL命令握爷,但它以毫秒為單位返回key的剩余生存時間跛璧,而不是像TTL命令那樣,以秒為單位新啼。

14. RANDOMKEY
RANDOMKEY

從當前數(shù)據(jù)庫中隨機返回(不刪除)一個key追城。

15. RENAME
RENAME key newkey

key改名為newkey
key 和newkey相同燥撞,或者key不存在時座柱,返回一個錯誤迷帜。 當newkey已經(jīng)存在時,RENAME`命令將覆蓋舊值色洞。

16. RENAMENX
RENAMENX key newkey

當且僅當newkey不存在時戏锹,將key改名為newkey
key不存在時火诸,返回一個錯誤锦针。

17. RESTORE
RESTORE key ttl serialized-value [REPLACE]

反序列化給定的序列化值,并將它和給定的key關(guān)聯(lián)置蜀。

18. SORT
SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

返回或保存給定列表奈搜、集合、有序集合key中經(jīng)過排序的元素盯荤。
排序默認以數(shù)字作為對象馋吗,值被解釋為雙精度浮點數(shù),然后進行比較廷雅。

19. TTL
TTL key

以秒為單位耗美,返回給定key的剩余生存時間(TTL, time to live)。

20. TYPE
TYPE key

返回key所儲存的值的類型航缀。
返回值:

  • none (key不存在)
  • string (字符串)
  • list (列表)
  • set (集合)
  • zset (有序集)
  • hash (哈希表)
21. SCAN
SCAN cursor [MATCH pattern] [COUNT count]

參考:http://redisdoc.com/key/scan.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末商架,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芥玉,更是在濱河造成了極大的恐慌蛇摸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灿巧,死亡現(xiàn)場離奇詭異赶袄,居然都是意外死亡,警方通過查閱死者的電腦和手機抠藕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門饿肺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盾似,你說我怎么就攤上這事敬辣。” “怎么了零院?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵溉跃,是天一觀的道長。 經(jīng)常有香客問我告抄,道長撰茎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任打洼,我火速辦了婚禮龄糊,結(jié)果婚禮上逆粹,老公的妹妹穿的比我還像新娘。我一直安慰自己绎签,他們只是感情好枯饿,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诡必,像睡著了一般奢方。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爸舒,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天蟋字,我揣著相機與錄音,去河邊找鬼扭勉。 笑死鹊奖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的涂炎。 我是一名探鬼主播忠聚,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唱捣!你這毒婦竟也來了两蟀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤震缭,失蹤者是張志新(化名)和其女友劉穎赂毯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拣宰,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡党涕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了巡社。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膛堤。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晌该,靈堂內(nèi)的尸體忽然破棺而出肥荔,到底是詐尸還是另有隱情,我是刑警寧澤气笙,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布次企,位于F島的核電站怯晕,受9級特大地震影響潜圃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舟茶,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一谭期、第九天 我趴在偏房一處隱蔽的房頂上張望堵第。 院中可真熱鬧,春花似錦隧出、人聲如沸踏志。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽针余。三九已至,卻和暖如春凄诞,著一層夾襖步出監(jiān)牢的瞬間圆雁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工帆谍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伪朽,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓汛蝙,卻偏偏與公主長得像烈涮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窖剑,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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