Redis的消息訂閱及發(fā)布及事務(wù)機制
訂閱發(fā)布
SUBSCRIBE PUBLISH
訂閱消息隊列及發(fā)布消息。
# 首先要打開redis-cli shell窗口 一個用于消息發(fā)布 一個用于消息訂閱
# SUBSCRIBE 訂閱一個頻道,如果頻道不存在 就新增一個
# 返回參數(shù) 表示 第一個是命令 第二個是頻道名稱 第三個表示當(dāng)前訂閱該頻道的數(shù)量
127.0.0.1:6379> SUBSCRIBE mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
# 在另外一個shell窗口 進行消息發(fā)布
127.0.0.1:6379> PUBLISH mychannel "hello world"
(integer) 1
# 在回到之前的shell 窗口 我們可以看到消息已經(jīng)被訂閱成功了
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
# 下面是本次接受到消息
1) "message"
2) "mychannel"
3) "hello world"
UNSUBSCRIBE
UNSUBSCRIBE:取消訂閱。
# 第三個返回值表示當(dāng)前沒有訂閱者訂閱該頻道
127.0.0.1:6379> UNSUBSCRIBE mychannel
1) "unsubscribe"
2) "mychannel"
3) (integer) 0
PSUBSCRIBE PUNSUBSCRIBE
根據(jù)通配符進行訂閱戶或者取消訂閱。
127.0.0.1:6379> PSUBSCRIBE my*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "my*"
3) (integer) 1
# 在另外一個Shell發(fā)布消息
127.0.0.1:6379> PUBLISH mychannel "hello world"
(integer) 1
127.0.0.1:6379> PUBLISH mynewchannel "hello world new"
(integer) 1
# 此時第一個Shell窗口就可以到如下的訂閱消息
1) "pmessage"
2) "my*"
3) "mychannel"
4) "hello world"
1) "pmessage"
2) "my*"
3) "mynewchannel"
4) "hello world new"
事務(wù)
Redis支持事務(wù),是基于4個基本指令。
- MULTI 開啟事務(wù)
- EXEC 執(zhí)行事務(wù)
- DISCARD 放棄事務(wù)
- WATHC 監(jiān)控
MULTI EXEC
MULTI命令開啟一個事務(wù),執(zhí)行MULTI之后,客戶端可以向服務(wù)器發(fā)送多條指令,這些指令不會立即執(zhí)行,而是被放入隊列中,當(dāng)執(zhí)行EXEC時,隊列中的所有命令才會被執(zhí)行。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age 3
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 4
127.0.0.1:6379> get age
"4"
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age 3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 19
3) (integer) 22
127.0.0.1:6379> get age
"22"
127.0.0.1:6379>
事務(wù)中錯誤的情況
- 如果是入隊的時候就報錯,那么即使在輸入EXEC指令,事務(wù)也不會執(zhí)行。
- 如果是入隊成功,但是執(zhí)行的時候報錯,那么會執(zhí)行正確的指令,錯誤的會被跳過,不會終止事務(wù)。
## 事務(wù)中出現(xiàn)錯誤的情況 入隊錯誤 事務(wù)不執(zhí)行
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
# 寫錯指令 出現(xiàn)錯誤提示
127.0.0.1:6379> INCR age 3
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get age
"22"
## 事務(wù)中出現(xiàn)錯誤的情況 入隊正確 執(zhí)行錯誤 事務(wù)正常執(zhí)行
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age abc
QUEUED
127.0.0.1:6379> INCRBY age 4
QUEUED
127.0.0.1:6379> exec
1) (integer) 23
2) (error) ERR value is not an integer or out of range
3) (integer) 27
127.0.0.1:6379> get age
"27"
? 由第二錯誤示例可以看到,Redis的事務(wù)是不支持回滾的。這是因為Redis考慮到是失敗的命令是由編程錯誤造成的,而這些錯誤應(yīng)該在開發(fā)的過程中被發(fā)現(xiàn),另外Redis不支持回滾能夠保持Redis 的內(nèi)部可以保持簡單且快速。
DISCARD
放棄事務(wù)。
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get age
"22"
WATCH
Redis中的CAS操作。WATCH 使得 EXEC 命令需要有條件地執(zhí)行: 事務(wù)只能在所有被監(jiān)視鍵都沒有被修改的前提下執(zhí)行, 如果這個前提不能滿足的話,事務(wù)就不會被執(zhí)行。當(dāng)執(zhí)行EXEC指令后,對key的WATCH會被取消。
? 被 WATCH 的鍵會被“監(jiān)控”,如果有任意一個或多個被監(jiān)視的鍵在 EXEC 執(zhí)行之前被修改了, 整個事務(wù)都會被取消, EXEC 返回nil-reply來表示事務(wù)已經(jīng)失敗。
# 第一個窗口
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 19
QUEUED
# 在第二個窗口 設(shè)置
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
# 在第一個窗口執(zhí)行事務(wù) 因為age已經(jīng)被更改了,所以本次事務(wù)執(zhí)行失敗
127.0.0.1:6379> EXEC
(nil)
## 被監(jiān)控的Key沒有變化時 事務(wù)可以正確執(zhí)行
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 25
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get age
"25"
以上就是Redis中訂閱發(fā)布及事務(wù)的的常用操作指令了,更多其他指令可以參考官網(wǎng),Redis官網(wǎng),謝謝閱讀,希望對你有所幫助。