Redis學習筆記—事務

事務簡單理解就是一組命令要麼執行,要麼全部不執行,否則執行一部分數據會造成數據不一致的問題

Redis提供了簡單的事務功能,不支持回滾操作,將一組需要批量執行的命令放到multi和exec兩個命令之間就可以實現簡單地事務功能。

  • multi命令代表事務開始
  • exec命令代表事務結束
  • discard命令代表中途中斷

下面添加一個名字爲Charlie的成績信息,要求一氣呵成的添加,如果沒有輸入exec之前,數據的返回值是“QUEUED”排隊的狀態,輸入exec之後數據就被寫入到Redis裏面了(如果中途想要中斷就輸入discard)

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set Charlie:english:score 88
QUEUED
127.0.0.1:6379> set Charlie:math:score 75
QUEUED
127.0.0.1:6379> set Charlie:totalscore 163
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
  • 如果整個執行過程中命令輸錯,比如set寫成了sett寫錯了,這樣整個事務就無法執行了
  • 如果整個執行過程中輸錯命令,把set寫成功了zset,因爲zset原來就存在這個命令所以不會報錯,需要開發人員自行處理
watch

有些應用場景需要在事務之前,確保事務中的key沒有被其他客戶端修改過,才執行事務,否則不執行(類似樂觀鎖)。Redis提供了watch命令來解決這類問題

客戶端1中使用watch命令標記key爲“java”的鍵

127.0.0.1:6379> watch java
OK

客戶端2操作設置了key爲“java”的值

127.0.0.1:6379> set java jedis
OK

客戶端1進行事務操作,會發現exec之後返回(nil)沒有執行成功,watch起到了效果

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set java Jedis
QUEUED
127.0.0.1:6379> exec
(nil)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章