網站首頁 編程語言 正文
Redis分布式鎖設置超時時間
Redis分布式鎖主要依靠Redis服務來完成,我們的應用程序其實是Redis節點的客戶端,一旦客戶端沒有釋放鎖,服務端就會一直持有這個鎖,其他進程中的線程就無法獲取到這把鎖,于是就會發生鎖死的情況。
所以我們在使用Redis分布式鎖的時候,務必要設置鎖的過期時間。
主要基于下面兩點:
網絡抖動
客戶端A中的一個線程獲取到了鎖,然后執行finally中的釋放鎖的代碼時,這時候網絡出問題了,導致客戶端A沒有成功釋放鎖。此時對于redis服務端來說,它會一直把鎖給客戶端A,這樣的話其他客戶端自然也就不能獲取到這個鎖。
如果是設置了過期時間的話,即使客戶端和服務端的網絡不通了,服務端依然在進行時間的計算,時間到了直接把鎖釋放掉,等網絡通了,不影響其他客戶端獲取鎖。
Redis宕機
客戶端A獲取到了鎖,Redis服務器突然宕機,鎖沒有釋放。等到Redis再次恢復的時候,Redis服務端還會把鎖給到客戶端A,這樣也會發生鎖死的情況。
如果是設置了過期時間的話,服務器恢復后就會繼續倒計時,時間到了服務器自動把鎖釋放,其他客戶端也就可以嘗試去獲取鎖了。
Redis分布式鎖的超時問題
Redis的分布式鎖并不能解決超時問題,如果在加鎖和釋放鎖之間的邏輯執行得太長,以至于超出了鎖的超時限制,就會出現問題,因為這時候第一個線程持有的鎖過期了,臨界區的邏輯還沒有執行完,而同時第二個線程就提前持有了這把鎖,導致臨界區代碼不能得到嚴格串行執行。
為了避免這個問題,分布式鎖不要用于較長時間的任務,如果真的偶爾出現了問題,造成的數據小錯亂,可能需要人工介入解決。
有一個稍微安全一點的方案,是將set指令的value參數設置為一個隨機數,釋放鎖時先匹配隨機數是否一致,然后在刪除key,這是為了確保當前線程占有的鎖不會被其他線程釋放,除非這個鎖是自動超時,但是匹配value,和刪除ke y不是一個原子操作,所以只是相對安全。
原文鏈接:https://weishihuai.blog.csdn.net/article/details/116326813
相關推薦
- 2022-07-22 Maven項目編譯運行后target/classes目錄下沒有xml和properties文件
- 2022-06-18 C#如何在窗體程序中操作數據庫數據_C#教程
- 2023-02-01 Python動態演示旋轉矩陣的作用詳解_python
- 2022-08-11 boost字符串處理函數format的用法_C 語言
- 2022-09-24 python中的[1:]、[::-1]、X[:,m:n]和X[1,:]的使用_python
- 2022-04-08 python實現有效的括號判斷實例代碼_python
- 2022-10-11 Flutter?語法進階抽象類和接口本質區別詳解_Dart
- 2022-04-19 css塊級元素,行內元素和行內塊級元素
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支