Redis手記之事務

1.事務

redis的事務是一個或者多個redis命令組成的批處理,當這多個命令中出現一條命令執行失敗的時候,其他的命令依舊會照樣執行,redis的事務並不具有原子性。當一個redis事務在執行的時候,新進來的redis命令不會插入到redis。

事務涉及到的redis命令如下:multi exec watch unwatch

命令 說明 demo
watch 監視一個或者多個key,從而來管理事務,如果在事務執行之前,這些key發生了變動,那麼事務將被打斷 127.0.0.1:6379> watch flagkey
OK
multi 開始一個事務 127.0.0.1:6379> multi
OK
exec 執行事務

127.0.0.1:6379> set username smallking
QUEUED
127.0.0.1:6379> set password hahaha
QUEUED
127.0.0.1:6379> sadd list 1 2 3
QUEUED
127.0.0.1:6379> exec

 

watch和事務的關係和順序如下:

 

              

watch可以用來當作併發的樂觀鎖。很多地方都有應用。例如用watch做個商品秒殺,僞代碼可以寫成這樣子:

jedis.watch(key); // key可以是商品數量
Transaction transaction = jedis.multi();// 標記一個事務塊的開始
transaction.set(key, String.valueOf(prdNum - 1));
List<Object> result = transaction.exec();// 執行事務 成功的話會有返回值
if (result == null || result.isEmpty()) {
	// watch-key被其他線程修改 再執行一遍搶的邏輯,知道key的數量 == 0
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章