探究Redis 02:基本操作與字符串

Redis鍵

Redis鍵是二進(jìn)制安全的,也就是說可以用任何二進(jìn)制數(shù)據(jù)作為Redis鍵,比如字符串“foo”或者一個(gè)JEPG文件。空字符串也是有效的Redis鍵。

其他的注意事項(xiàng)包括:

  • 不推薦太長的Redis鍵,例如:1024字節(jié)的鍵內(nèi)容既浪費(fèi)內(nèi)存,也耗費(fèi)計(jì)算資源,如果鍵內(nèi)容較多,建議首先計(jì)算HASH值(SHA1),再作為Redis鍵存儲。
  • 避免太短的Redis鍵。例如:不建議用"u1000flw" 替換 "user:1000:followers"。因?yàn)楹笳呖勺x性更好,且并無明顯開銷。鍵設(shè)計(jì)需要平衡可讀性和內(nèi)存占用。
  • 推薦通過統(tǒng)一分隔符定義鍵格式,例如:"comment:1234:reply.to" 或者 "comment:1234:reply-to"。
  • Redis鍵最大長度為512MB。

Redis字符串(strings)

Redis字符串是一種簡單的值數(shù)據(jù),可以關(guān)聯(lián)到Redis鍵。在Memcached中,是唯一支持的數(shù)據(jù)類型,也是Redis新手很容易理解的類型。因?yàn)镽edis鍵是字符串,當(dāng)使用字符串作為值時(shí),其實(shí)我們關(guān)聯(lián)了兩個(gè)字符串。這種字符串類型通常可以被用于緩存HTML片段或頁面。字符串類型可以存儲任何二進(jìn)制數(shù)據(jù), 例如:jpeg圖像。字符串不能超過512 MB大小。

示例:

> set mykey somevalue
OK
> get mykey
"somevalue"

正如你看到的,SETGET 可用于設(shè)置和獲取字符串值。需要注意的是即便之前Redis鍵保存的值不是字符串類型,SET也會替換Redis鍵對應(yīng)的值。所以SET可以被看做賦值操作。

SET 可以通過額外的參數(shù)支持有趣的操作選項(xiàng)。例如:可以要求SET在鍵已存在時(shí)返回操作失敗,或者相反,只在鍵存在時(shí)成功。

> set mykey newval nx
(nil)
> set mykey newval xx

OK

即便字符串只是基本Redis值類型, 仍然仍然實(shí)現(xiàn)了一些有趣的操作,例如:原子遞增。

> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

INCR 命令可以將字符串視作整數(shù),對其做加1操作,并保存到原值。類似的操作還包括:INCRBY, DECRDECRBY。在內(nèi)部,這些命令功能類似,只是邏輯稍有不同。

那么INCR的原子性又是指什么呢?你可以理解成多個(gè)客戶同時(shí)向同一個(gè)Redis鍵內(nèi)容發(fā)起INCR命令時(shí),并不存在相互競爭。比如說:對于同一個(gè)Redis鍵,client 1 讀取到"10"的同時(shí)client 2 也讀取到"10",兩個(gè)client同時(shí)發(fā)起INCR,使得新的鍵值為11的可能性并不存在。也就是說,操作結(jié)果只能是12,因?yàn)镽edis會保證一個(gè)client自增操作時(shí),其他client對此Redis鍵的操作不會同時(shí)進(jìn)行。

字符串類型還支持很多其他操作。例如:GETSET 設(shè)置新值的同時(shí), 將舊值作為返回結(jié)果。你可以在通過INCR 命令統(tǒng)計(jì)網(wǎng)站訪客數(shù)量時(shí)使用這個(gè)命令。你也許需要每小時(shí)統(tǒng)計(jì)一次數(shù)量,但不想丟失一個(gè)訪客數(shù)量統(tǒng)計(jì)。這種情況下,你可以GETSETRedis統(tǒng)計(jì)鍵, 將新值設(shè)置為"0",并獲取之前的統(tǒng)計(jì)值作為上一小時(shí)的統(tǒng)計(jì)數(shù)量。

可以在一條命令里同時(shí)設(shè)置或獲取多個(gè)Redis鍵值的操作也可以顯著降低操作延時(shí)。 你可以使用 MSETMGET 命令實(shí)現(xiàn)這個(gè)效果:

> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"

當(dāng)使用MGET時(shí),Redis返回值數(shù)組。

鍵空間命令

有些命令不限于特定數(shù)據(jù)類型,這些命令可以實(shí)現(xiàn)一些鍵空間的交互操作,可以在任何數(shù)據(jù)類型上使用。例如:EXISTS 命令通過返回1或0來表示給定Redis鍵在數(shù)據(jù)庫中是否存在,DEL命令可以刪除任何類型的鍵值對。

> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

上面的示例中,你可以看到 DEL也返回1或0來表示Redis鍵是否成功移除,刪除前已存在返回1,否則返回0。

Redis支持各種鍵空間相關(guān)命令,但上面兩個(gè)是基礎(chǔ)命令。和他們一樣常見的TYPE命令,可以返回值對應(yīng)的數(shù)據(jù)類型。

> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none

Redis超時(shí): 有限生存期的Redis鍵

在繼續(xù)探討更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)前,我們需要了解另一個(gè)與數(shù)據(jù)類型無關(guān)的Redis特性,成為Redis 超時(shí)。一般來說你可以為Redis鍵設(shè)置一個(gè)超時(shí)時(shí)間,來表示它的生存周期。超時(shí)后,Redis鍵值將自動銷毀,效果類似執(zhí)行DEL 命令。

以下簡要說明Redis 超時(shí):

  • 支持設(shè)置秒或毫秒作為計(jì)時(shí)單位。
  • 超時(shí)最終精確到毫秒精度。
  • 超時(shí)信息會持久到磁盤,即便Redis停機(jī)仍保持計(jì)時(shí)。 (Redis通過記錄鍵過期時(shí)間實(shí)現(xiàn)此效果)。

設(shè)置超時(shí)十分簡單,且開銷很小:

> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)

兩次GET 操作之間Redis鍵因5秒超時(shí)自動消失。
在上面示例中,我們用EXPIRE 命令設(shè)置超時(shí)。(這個(gè)命令還能在已經(jīng)存在超時(shí)時(shí)間的Redis鍵上實(shí)現(xiàn)變更超時(shí)時(shí)間。類似的PERSIST 命令可以撤銷超時(shí)營銷,使Redis鍵值長期保存). 我們也可以在Redis鍵創(chuàng)建時(shí)指定超時(shí),通過啟用SET 選項(xiàng)實(shí)現(xiàn):

> set key 100 ex 10
OK
> ttl key
(integer) 9

上面示例中,字符串被設(shè)置為100,10秒超時(shí)。之后的TTL 命令用來檢測剩余的存活時(shí)間。

如果希望使用毫秒計(jì)時(shí)單位, 請查看PEXPIREPTTL 命令, 以及SET命令的選項(xiàng)列表。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

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