91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

用Redis實現分布式鎖的方案

發布時間:2021-09-10 10:12:22 來源:億速云 閱讀:112 作者:chen 欄目:大數據

本篇內容主要講解“用Redis實現分布式鎖的方案”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“用Redis實現分布式鎖的方案”吧!

       在實際項目開發中經常會遇到這樣一個業務場景:如果同一臺機器有多個線程搶奪同一個共享資源,同一個線程多次執行會出現異常,這種情況下就會出現非線程安全。我們解決方法通常使用鎖來解決。但是如果有多臺機器呢?這時候我們通常使用分布式鎖來解決分布式環境下共享資源的同步問題。實現分布式鎖常見有Rediszookeeper等,今天主要就是講講如何使用Redis實現分布式鎖。

      使用Redis實現分布式鎖的方案其實很簡單,首先我們先實現一個方案一:每次執行請求的時候,機器先查詢Redis中是否存在分布式鎖的key,如果不存在鎖的key,就以該鎖為keyvalue取隨機數寫入到Redis中,然后開始執行請求。

      方案一看起來很簡單,但是這樣的處理邏輯不可避免的存在兩個致命的BUG:第一:如果一個進程成功取到鎖,但是這時候這個機器出現故障宕機了,分布式的鎖沒有得到釋放,就造成了死鎖的產生了。第二:如果同一時間存在兩個機器同時查詢Redis,都發現Redis不存在鎖的key,于是都成功獲得了鎖。

     這時候我們可以這么處理改善方案一實現方案二:Redis有提供一個原子寫入操作的命令:setnxsetnx只有在鎖的key不存在的情況下才允許設置key值,所以說問題2同一個鎖在同一時間可能會被不同機器獲取到的問題就可以得到解決,而且setnx命令可以設置key值的超時時間,所以在寫入鎖的key時可以為鎖設置一個超時時間,如果超過超時時間鎖還未釋放就會釋放,則其他機器在key釋放后也可以繼續寫入key占有鎖執行對應的請求。這樣問題1機器宕機造成鎖無法及時釋放的問題也因此迎刃而解。

     但是這又造成了另外一個潛在的問題:如果某個機器執行耗時操作,超時時間過去了請求還未執行完,鎖就會被釋放掉被新的機器占有,等耗時任務結束時執行釋放鎖的操作,這時候釋放的鎖不是自己的鎖而是已經被其他機器占有的鎖。

     這時候我們可以將方案再做適當的修改變成方案三:當某個機器占有鎖并在Redis中設置key時,將value設置為隨機數,在請求處理完畢需要釋放鎖之前加上一步操作:判斷keyvalue值是否等于之前設置的隨機數,如果是代表這個鎖占有者還是自己,就可以執行釋放鎖操作,否則代表鎖已經被別人占有,不能執行釋放鎖操作,這樣就可以解決可能誤操作釋放他人鎖的問題。但是由于查詢和釋放鎖的操作非原子性的,所以可能出現一種情況:在查詢key時發現keyvalue和機器本身設置的一直,但是還沒來得急釋放鎖時,鎖過期被釋放了,這時候執行釋放鎖操作就會導致釋放的依舊是其他機器占有的鎖,所以我們方案三需要進一步的改進,也就是我們必須要保證查詢鎖和釋放鎖這兩步操作必須是原子性的,這時候我們就需要使用另一種方式:引入Jedis,使用Lua腳本將查詢鎖和釋放鎖的兩部分邏輯寫成腳本,于是Redis執行Lua腳本時,其他機器的所有命令都必須等到Lua腳本執行結束才能執行,所以不可能存在查詢鎖結束還未釋放就被其他機器占領的情況。  

       到這里我們介紹完了如何使用Redis實現分布式鎖,但是這是基于單機部署,如果Redis是使用多機部署,每個主節點還有有子節點,由于Redis主從復制是異步操作,所在上述方案肯定會出現問題的,多機部署可以采用Redission實現分布式鎖,這是官方提供的組件,如果感興趣可以自己閱讀下文檔:
https://github.com/redisson/redisson
 

到此,相信大家對“用Redis實現分布式鎖的方案”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柯坪县| 越西县| 三原县| 宁安市| 万宁市| 临颍县| 玛纳斯县| 饶河县| 班玛县| 天全县| 抚州市| 亚东县| 鄂州市| 改则县| 句容市| 大方县| 南宫市| 焦作市| 河池市| 道真| 阿坝| 方山县| 乌审旗| 建德市| 太仆寺旗| 庆云县| 获嘉县| 禹州市| 中牟县| 江山市| 五峰| 敦煌市| 宣恩县| 新绛县| 志丹县| 重庆市| 邹城市| 翼城县| 乳山市| 玉树县| 兴和县|