Redis中的事物和鎖

卑微小吳勵志寫博客第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

注意:
在這裏插入圖片描述

明後天高考,祝莘莘學子考上理想的大學, 讓知識改變命運。加油!!!

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