溫馨提示×

溫馨提示×

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

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

redis分布式鎖優化的具體實現

發布時間:2021-09-15 17:11:31 來源:億速云 閱讀:184 作者:chen 欄目:開發技術

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

對于單機的應用來說,可以直接使用synchronized關鍵字或著Lock工具類來加鎖;但是對于分布式應用我們需要憑借一些工具來實現加鎖;

加鎖流程通俗來解釋就是:
        1. 占坑
        2. 執行邏輯
        3. 填坑

我們可以使用redis來完成占坑這個操作;

基礎版加鎖

//通過占坑的方式獲取鎖
boolean lock = redis.setIfAbsent(key, value);
if (lock) {
//業務邏輯

//填坑
redis.delete(lock)
}

如果獲取鎖之后,應用宕機導致未釋放鎖,會造成死鎖

獲取鎖的時候需要給鎖添加過期時間

redis.setIfAbsent(key, value);
redis.expire(key, value);

如果在獲取鎖的時候,意外導致過期時間沒設置成功,也會導致死鎖

通過lua腳本將set、expire兩個操作合并成原子操作,確保過期時間能設置成功

如果鎖過期了,但是當前任務未執行結束,此時鎖就可能被其他應用獲取到,并更新鎖的key。如果此時當前任務執行結束去釋放鎖,會將別人的鎖給釋放掉

釋放鎖:

  • 判斷當前鎖的值和自己上鎖的值是不是吻合的;

  • 如果不吻合則不釋放;

  • 如果值吻合,就刪除key釋放鎖;

在釋放鎖的時候,如果判斷key值吻合,但此時key過期了,鎖被別人獲取到,此時再刪除key,就是釋放了別人的鎖了
要保證查詢、判斷、刪除邏輯為原子操作,使用lua腳本

如何保證鎖的可重入

如果在遞歸方法有加鎖邏輯或其他調用有

lock.lock();
//邏輯
lock.lock();
//邏輯
lock.unLock();
lock.unLock();

要實現可重入鎖,可以在鎖的value值上做文章,在value值上記錄重入次數,每次重入次數加一,每次unlock次數減一,直至為零,則刪除key 釋放鎖;

key:
{
    "value":1
}

如果業務邏輯時間過長,鎖提前過期釋放了怎么辦

  • 將過期時間設置的長一點

  • 需要給鎖添加續期功能。

設置長過期時間的弊端就是,如果應用宕機之后鎖需要經歷較長的時間才能被別人獲取,影響業務;

如果是有續期功能的話,如果宕機,鎖也會被較短的過期時間給刷掉,是種更優美的解決方式;

如redission中獲取鎖后,會啟動一個watchDog線程來監控當前線程是否還持有鎖,如果還持有鎖,就給他續期

具體操作為: 每十秒檢查一下是否持有鎖,如果鎖未釋放就重置一下鎖的過期時間,實現續期;

如果應用在redis的master節點上獲取鎖成功,此時該master節點宕機,且鎖數據還未同步到slave節點上,主從切換之后,其他應用趁機也獲取了分布式鎖

redLock

主從結構不是會有問題嗎,redlock就換成使用多個不相關的、沒有主從關系的redisMaster節點,來保證他們不會同時宕機,總數最好為奇數個。
redLock通過在多個節點上同時獲取鎖,如果超過半數的節點都獲取鎖成功,才算成功;否則失敗,回滾刪除所有節點的鎖。

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

向AI問一下細節

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

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女