溫馨提示×

溫馨提示×

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

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

redis分布式鎖優(yōu)化的具體實(shí)現(xiàn)

發(fā)布時間:2021-09-15 17:11:31 來源:億速云 閱讀:130 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“redis分布式鎖優(yōu)化的具體實(shí)現(xiàn)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“redis分布式鎖優(yōu)化的具體實(shí)現(xiàn)”吧!

對于單機(jī)的應(yīng)用來說,可以直接使用synchronized關(guān)鍵字或著Lock工具類來加鎖;但是對于分布式應(yīng)用我們需要憑借一些工具來實(shí)現(xiàn)加鎖;

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

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

基礎(chǔ)版加鎖

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

//填坑
redis.delete(lock)
}

如果獲取鎖之后,應(yīng)用宕機(jī)導(dǎo)致未釋放鎖,會造成死鎖

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

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

如果在獲取鎖的時候,意外導(dǎo)致過期時間沒設(shè)置成功,也會導(dǎo)致死鎖

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

如果鎖過期了,但是當(dāng)前任務(wù)未執(zhí)行結(jié)束,此時鎖就可能被其他應(yīng)用獲取到,并更新鎖的key。如果此時當(dāng)前任務(wù)執(zhí)行結(jié)束去釋放鎖,會將別人的鎖給釋放掉

釋放鎖:

  • 判斷當(dāng)前鎖的值和自己上鎖的值是不是吻合的;

  • 如果不吻合則不釋放;

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

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

如何保證鎖的可重入

如果在遞歸方法有加鎖邏輯或其他調(diào)用有

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

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

key:
{
    "value":1
}

如果業(yè)務(wù)邏輯時間過長,鎖提前過期釋放了怎么辦

  • 將過期時間設(shè)置的長一點(diǎn)

  • 需要給鎖添加續(xù)期功能。

設(shè)置長過期時間的弊端就是,如果應(yīng)用宕機(jī)之后鎖需要經(jīng)歷較長的時間才能被別人獲取,影響業(yè)務(wù);

如果是有續(xù)期功能的話,如果宕機(jī),鎖也會被較短的過期時間給刷掉,是種更優(yōu)美的解決方式;

如redission中獲取鎖后,會啟動一個watchDog線程來監(jiān)控當(dāng)前線程是否還持有鎖,如果還持有鎖,就給他續(xù)期

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

如果應(yīng)用在redis的master節(jié)點(diǎn)上獲取鎖成功,此時該master節(jié)點(diǎn)宕機(jī),且鎖數(shù)據(jù)還未同步到slave節(jié)點(diǎn)上,主從切換之后,其他應(yīng)用趁機(jī)也獲取了分布式鎖

redLock

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

到此,相信大家對“redis分布式鎖優(yōu)化的具體實(shí)現(xiàn)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI