Redis事務與鎖應用
阿新 • • 發佈:2018-12-21
將一系列操作繫結成一個事務,這些操作要麼都發生,要麼都不發生。
redis中與事務有關的3種操作:
multi # 開啟事務
exec # 執行事務
discard # 取消事務
舉例
127.0.0.1:6379> multi # 開啟事務
OK
127.0.0.1:6379> set wang 1000
QUEUED # 命令並不執行,而是放在任務佇列中
127.0.0.1:6379> set zhao 1000
QUEUED
127.0.0.1:6379> incrby wang 100
QUEUED
127.0.0.1:6379> decrby zhao 100
QUEUED
127.0 .0.1:6379> exec # 執行任務佇列中命令
1) OK
2) OK
3) (integer) 1100
4) (integer) 900
multi 後面的語句出錯有兩種可能:
- 語法有問題
這種,exec時,報錯,所有語句得不到執行 - 語法本身沒錯,但適用物件有問題,比如zadd操作link物件
exec後,會執行正確的語句,並跳過有不是放的語句
那麼zadd操作link這種事怎麼避免?答案:只能由程式設計師負責。
watch監視
watch監視key是否被改變,如果有變,則事務被取消
思考
我正在買票
Ticket-1,money-100
而票只有一張,如果在我multi之後,和exec之間,票被別人買走了,即ticket變成0了,我該如何觀察這種情景,並不再提交。
方式1-悲觀的想法:世界充滿危險,肯定有人和我強,給ticket上鎖,只有我能操作[悲觀鎖]
方式2-樂觀的想法:沒有人和我搶,因此我只需要注意,有沒有人更改ticket的值使其變小[樂觀鎖]
redis的事務中,啟用的是樂觀鎖,只負責檢測key是否被改動,使用watch命令