事務簡單理解就是一組命令要麼執行,要麼全部不執行,否則執行一部分數據會造成數據不一致的問題
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)