卑微小吳勵志寫博客第28天。
事務簡介
Redis在執行指令過程中,多條連續的指令被打斷,干擾,插對。
例如:
客戶端1插入一條數據,準備查的時候,客戶端2插入同樣key的數據,導致客戶端1沒能查到想要的結果。
redis的事物就是一個命令執行的隊列,將一系列命令包裝成一個整體(一個隊列)。當執行時,一次性按照添加順序執行,中間不會被幹擾或者被打斷。
一個隊列中一次性,順序性,排他性的執行一系列指令。
事務的基本操作
開啓事務
- mutil
作用
- 設定事務的開啓位置,此指令執行後,後續的所有指令均加入到事務中。
執行事務
- exec
作用
- 設定事務的結束位置,同時執行事務。與mutil成對出現,成對使用。
注意:當開啓mutil後,命令加入隊列是沒有立即執行的,只有執行exec命令時纔開始執行。
事務定義錯了或者中間寫錯了怎麼辦?
取消事務
- discard
作用
- 終止當前事務的定義,發生在mutil之後,exec之前。
事務的工作流程
事務的注意事項
注意:如果是語法沒有錯誤,命令執行出現錯誤,則已經執行的命令是沒法進行回滾的,需要程序員在代碼中實現回滾。
鎖
業務場景:
比如天貓雙十一,搞特賣,商品庫存不足了,4個業務員去補貨,但是補貨有一系列操作,如何做到不重複操作。
解決方案:
- 對key添加監控鎖,在執行exec前,如果key發生了變化,終止事務執行。
watch key1 [key2…] - 取消對所有key的監控
unwatch
基於特定條件的事物執行—分佈式鎖
使用setnx設置一個公共鎖
setnx lock-key value
利用setnx的返回值特徵,有值則返回失敗,無值則返回成功
- 對於返回設置成功的,擁有控制權,進行下一步的具體業務操作。
- 對於返回失敗的,不具有控制權,排隊或等待。
操作完成後,通過del操作釋放鎖。
應用場景:redis應用基於分佈式鎖對應的場景控制。
忘了釋放鎖怎麼辦?
如果一個客戶端拿到鎖了,在執行操作的時候宕機了,沒有釋放鎖,怎麼辦?
- 需要解鎖操作不僅僅只能是用戶控制,系統級別要給出對應的保底處理方案。
解決方案
- 使用expire爲鎖key添加時間限定,到時不釋放,放棄鎖。
expire lock-key second
peexpire lock-key millsecond
注意:
明後天高考,祝莘莘學子考上理想的大學, 讓知識改變命運。加油!!!