溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Redis中的發(fā)布訂閱和事務(wù)怎么使用

發(fā)布時(shí)間:2021-12-07 13:44:38 來(lái)源:億速云 閱讀:136 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Redis中的發(fā)布訂閱和事務(wù)怎么使用”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Redis中的發(fā)布訂閱和事務(wù)怎么使用”吧!

發(fā)布訂閱

redis的發(fā)布訂閱系統(tǒng)有點(diǎn)類(lèi)似于我們生活中的電臺(tái),電臺(tái)可以在某一個(gè)頻率上發(fā)送廣播,而我們可以接收任何一個(gè)頻率的廣播,Android中的broadcast也和這類(lèi)似。

訂閱消息的方式如下:

127.0.0.1:6379> SUBSCRIBE c1 c2 c3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "c1"
3) (integer) 1
1) "subscribe"
2) "c2"
3) (integer) 2
1) "subscribe"
2) "c3"
3) (integer) 3

這個(gè)表示接收c1,c2,c3三個(gè)頻道傳來(lái)的消息,發(fā)送消息的方式如下:

127.0.0.1:6379> PUBLISH c1 "hello redis!"
(integer) 1

當(dāng)c1這個(gè)頻道上有消息發(fā)出時(shí),此時(shí)在消息訂閱控制臺(tái)可以看到如下輸出:

1) "message"
2) "c1"
3) "hello redis!"

在redis中,我們也可以使用模式匹配訂閱,如下:

127.0.0.1:6379> PSUBSCRIBE c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1

此時(shí)可以接收到所有以c開(kāi)頭的頻道發(fā)來(lái)的消息。

tips

redis中的發(fā)布訂閱系統(tǒng)在某些場(chǎng)景下還是非常好用的,但是也有一些問(wèn)題需要注意:由于網(wǎng)絡(luò)在傳輸過(guò)程中可能會(huì)遭遇斷線(xiàn)等意外情況,斷線(xiàn)后需要進(jìn)行重連,然而這會(huì)導(dǎo)致斷線(xiàn)期間的數(shù)據(jù)丟失。

事務(wù)

既然redis是一種NoSQL數(shù)據(jù)庫(kù),那它當(dāng)然也有事務(wù)的功能,不過(guò)這里的事務(wù)和我們關(guān)系型數(shù)據(jù)庫(kù)中的事務(wù)有一點(diǎn)點(diǎn)差異。
redis中事務(wù)的用法非常簡(jiǎn)單,我們通過(guò)MULTI命令開(kāi)啟一個(gè)事務(wù),如下:

127.0.0.1:6379> MULTI
OK

在MULTI命令執(zhí)行之后,我們可以繼續(xù)發(fā)送命令去執(zhí)行,此時(shí)的命令不會(huì)被立馬執(zhí)行,而是放在一個(gè)隊(duì)列中,如下:

127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED

當(dāng)所有的命令都輸入完成后,我們可以通過(guò)EXEC命令發(fā)起執(zhí)行,也可以通過(guò)DISCARD命令清空隊(duì)列,如下:

127.0.0.1:6379> EXEC
1) OK
2) OK
3) OK

事務(wù)中的異常情況

redis中事務(wù)的異常情況總的來(lái)說(shuō)分為兩類(lèi):
1.進(jìn)入隊(duì)列之前就能發(fā)現(xiàn)的錯(cuò)誤,比如命令輸錯(cuò);
2.執(zhí)行EXEC之后才能發(fā)現(xiàn)的錯(cuò)誤,比如給一個(gè)非數(shù)字字符加1;

那么對(duì)于這兩種不同的異常,redis中有不同的處理策略。對(duì)于第一種錯(cuò)誤,服務(wù)器會(huì)對(duì)命令入隊(duì)失敗的情況進(jìn)行記錄,并在客戶(hù)端調(diào)用 EXEC 命令時(shí),拒絕執(zhí)行并自動(dòng)放棄這個(gè)事務(wù)(這個(gè)是2.6.5之后的版本做法,之前的版本做法小伙伴可以參考官方文檔)。如下:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set kv1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3 3 3
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) OK
3) (error) ERR syntax error
4) OK
127.0.0.1:6379> keys *
1) "k4"
2) "k2"
3) "kv1"

而對(duì)于第二種情況,redis并沒(méi)有對(duì)它們進(jìn)行特別處理, 即使事務(wù)中有某個(gè)/某些命令在執(zhí)行時(shí)產(chǎn)生了錯(cuò)誤, 事務(wù)中的其他命令仍然會(huì)繼續(xù)執(zhí)行。如下:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 vv
QUEUED
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> GET k1
"vv"

不同于關(guān)系型數(shù)據(jù)庫(kù),redis中的事務(wù)出錯(cuò)時(shí)沒(méi)有回滾,對(duì)此,官方的解釋如下:

Redis 命令只會(huì)因?yàn)殄e(cuò)誤的語(yǔ)法而失?。ú⑶疫@些問(wèn)題不能在入隊(duì)時(shí)發(fā)現(xiàn)),或是命令用在了錯(cuò)誤類(lèi)型的鍵上面:這也就是說(shuō),從實(shí)用性的角度來(lái)說(shuō),失敗的命令是由編程錯(cuò)誤造成的,而這些錯(cuò)誤應(yīng)該在開(kāi)發(fā)的過(guò)程中被發(fā)現(xiàn),而不應(yīng)該出現(xiàn)在生產(chǎn)環(huán)境中。因?yàn)椴恍枰獙?duì)回滾進(jìn)行支持,所以 Redis 的內(nèi)部可以保持簡(jiǎn)單且快速。

WATCH命令

事務(wù)中的WATCH命令可以用來(lái)監(jiān)控一個(gè)key,通過(guò)這種監(jiān)控,我們可以為redis事務(wù)提供(CAS)行為。 如果有至少一個(gè)被WATCH監(jiān)視的鍵在EXEC執(zhí)行之前被修改了,那么整個(gè)事務(wù)都會(huì)被取消,EXEC返回nil-reply來(lái)表示事務(wù)已經(jīng)失敗。如下:

Redis中的發(fā)布訂閱和事務(wù)怎么使用  

通過(guò)unwatch命令,可以取消對(duì)一個(gè)key的監(jiān)控,如下:

Redis中的發(fā)布訂閱和事務(wù)怎么使用  

到此,相信大家對(duì)“Redis中的發(fā)布訂閱和事務(wù)怎么使用”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI