redis 事務和鎖

2021-10-19 12:30:05 字數 1599 閱讀 8902

何為事務:

redis事務就是乙個命令執行的佇列,將一些命令包裝為乙個整體,在執行時,一次性全部依次執行,中間不會被打斷。

注意事項:

若multi開啟事務後,後續指令存在語法錯誤,則指令佇列被銷毀。事務停止。

事務的基本操作:

1、multi (開啟事務)

2、exec (執行事務)

3、discard (取消事務,銷毀事務佇列中的所有指令)

何為監控鎖:

為解決多執行緒運算元據導致的衝突引入的操作。對指定的key實現監控,若key在事務中發生了變化,則後續的exec會執行失敗。

監視鎖的基本操作:

1、watch key1 key2 (監控key。在multi前加鎖,若在事務執行前,監視的key值發生變化,則事務會執行失敗)

2、unwatch (取消監控鎖)

分布式鎖的基本操作:

1、setnx key value

(建立分布式鎖。運用string中的setnx特性,若key不存在可set成功,若key存在會set失敗的特性,來模擬鎖互斥鎖。)

2、del key (刪除分布式鎖)

3、expire lock-key second (為鎖新增時效,超過second秒未解鎖時自動解鎖)

4、pexpire lock-key mlliseconds (為鎖新增時效,超過mlliseconds毫秒未解鎖時自動解鎖)

應用:

redis分布式鎖的實質只是提供了乙個語法,setnx,設定乙個key的值,如果key不存在就設定成功,key已存在就設定失敗。在實際應用中想實現鎖的效果還需要新增額外**,流程如下:

1、迴圈設定key為num-lock的變數為1,直至設定成功時指令返回true(1)

while(setnx num-lock 1 == 0)

2、在多個客戶端同時設定時,僅會有乙個客戶端設定成功其它客戶端則卡在迴圈中

3、設定成功進行相關操作

4、del num-lock,刪除鎖該客戶端操作結束

5、此時num-lock變數被刪除,下乙個在迴圈中的客戶端將拿到鎖進入到業務操作中

問題:

在這種應用場景下就會有乙個問題,當其中乙個客戶端在設定num-lock鎖後如果宕機了,那從此刻起其它的客戶端將永遠無法獲取到鎖,因為num-lock變數已存在且未刪除。

針對客戶端setnx鎖後宕機導致死鎖的問題,針對此問題,可以對鎖加乙個新增乙個時效性來解決該問題。

expire、pexpire指令 :

為鎖lock-key設定生存時間(秒),到時不釋放則自動刪除

expire lock-key second

設定生存時間(豪秒),到時不釋放則自動刪除

pexpire lock-key milliseconds鎖lock-key

redis 事務和鎖

redis與 mysql事務的對比 在mutil後面的語句中,語句出錯可能有2種情況 redis 鎖 redis流水線 效能測試 set time limit 0 ini set memory limit 1024m redis new redis g 1 redis connect 127.0.0...

redis事務和鎖

redis事務就是乙個命令執行的佇列,將一系列預定義命令包裝成乙個整體 乙個佇列 當執行時,一次性按照新增順序依次執行,中間不會被打斷或者干擾。事務的基本操作 開啟事務 multi 作用 設定事務的開啟位置,此指令執行後,後續的所有指令均加入到事務中 執行事務 exec 作用 設定事務的結束位置,同...

Redis事務 事務鎖

一旦成功所有的成功,乙個失敗,所有一些列連續動作都失敗 事務的基本操作 注意 加入事務的命令暫時到任務佇列中,並沒有立即執行,只有執行exec命令才開始執行事務定義過程中發現問題,怎麼辦?discard 事務的工作流程 事務的注意事項 手動進行事務回滾 業務場景1 業務分析 基於特定條件的事務執行 ...