1. 程式人生 > >Redis事務與鎖應用

Redis事務與鎖應用

將一系列操作繫結成一個事務,這些操作要麼都發生,要麼都不發生。

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 後面的語句出錯有兩種可能:

  1. 語法有問題
    這種,exec時,報錯,所有語句得不到執行
  2. 語法本身沒錯,但適用物件有問題,比如zadd操作link物件
    exec後,會執行正確的語句,並跳過有不是放的語句
    那麼zadd操作link這種事怎麼避免?答案:只能由程式設計師負責。

watch監視

watch監視key是否被改變,如果有變,則事務被取消

思考
我正在買票
Ticket-1,money-100
而票只有一張,如果在我multi之後,和exec之間,票被別人買走了,即ticket變成0了,我該如何觀察這種情景,並不再提交。
方式1-悲觀的想法:世界充滿危險,肯定有人和我強,給ticket上鎖,只有我能操作[悲觀鎖]
方式2-樂觀的想法:沒有人和我搶,因此我只需要注意,有沒有人更改ticket的值使其變小[樂觀鎖]
redis的事務中,啟用的是樂觀鎖,只負責檢測key是否被改動,使用watch命令