一、redis事物及鎖應(yīng)用
MULTI、EXEC、DISCARD和WATCH命令是Redis事務(wù)功能的基礎(chǔ)。Redis事務(wù)允許在一次單獨的步驟中執(zhí)行一組命令,并且可以保證如下兩個重要事項:
1、Redis會將一個事務(wù)中的所有命令序列化,然后按順序執(zhí)行。Redis不可能在一個Redis事務(wù)的執(zhí)行過程中插入執(zhí)行另一個客戶端發(fā)出的請求。這樣便能保證Redis將這些命令作為一個單獨的隔離操作執(zhí)行。2、在一個Redis事務(wù)中,Redis要么執(zhí)行其中的所有命令,要么什么都不執(zhí)行,這種特性保證了其原子性。
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby wang 100
QUEUED
127.0.0.1:6379> incrby zhao 100
QUEUED
127.0.0.1:6379> exec
1) (integer) 600
2) (integer) 300
- Redis事物不支持回滾, 對于隊列中的指令,只能檢查語法錯誤(語法錯誤則直接取消執(zhí)行),不能發(fā)現(xiàn)邏輯錯誤,并且對于之前的指令,執(zhí)行了不能回滾,雖然在multi中可以執(zhí)行discard清空執(zhí)行隊列,但是一旦執(zhí)行,不支持回滾操作。
PS:由于Redis官網(wǎng)無法正常訪問,只能使用其他漢化手冊(redis參考手冊)
Redis使用的是樂觀鎖,只是監(jiān)視事物變化,一旦變化,則視為異常,阻止事物的執(zhí)行
//使用鎖正常時
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> decrby lisi 100
QUEUED
127.0.0.1:6379> exec
1) (integer) 0
2) (integer) 400
//使用鎖異常時
127.0.0.1:6379> set ticket 1
OK
127.0.0.1:6379> watch ticket
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decr ticket
QUEUED
127.0.0.1:6379> decrby lisi 100
QUEUED
127.0.0.1:6379> exec
(nil)
二、消息發(fā)布與訂閱
- 消息發(fā)布
127.0.0.1:6379> publish news "Hello World!"
(integer) 0
127.0.0.1:6379> publish news "Hello World!"
(integer) 1
- 監(jiān)聽(監(jiān)聽端口可以加入通配符等,來一次監(jiān)聽多個端口)
127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "Hello World!"
- 使用pubsub channels命令可以查看有哪些端口被監(jiān)聽