欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年09月15日 16:08:36   作者:我的頭疼  
本文主要介紹了redis分布式鎖優(yōu)化的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

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

基礎(chǔ)版加鎖

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

//填坑
redis.delete(lock)
}

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

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

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

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

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

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

釋放鎖:

  • 判斷當前鎖的值和自己上鎖的值是不是吻合的;
  • 如果不吻合則不釋放;
  • 如果值吻合,就刪除key釋放鎖;

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

如何保證鎖的可重入

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

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

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

key:
{
    "value":1
}

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

  • 將過期時間設(shè)置的長一點
  • 需要給鎖添加續(xù)期功能。

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

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

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

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

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

redLock

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

參考

原來大廠Redis分布式鎖都這么設(shè)計的

Redis分布式鎖的原理以及如何續(xù)期

到此這篇關(guān)于redis分布式鎖優(yōu)化的實現(xiàn)的文章就介紹到這了,更多相關(guān)redis分布式鎖優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • NoSQL和Redis簡介及Redis在Windows下的安裝和使用教程

    NoSQL和Redis簡介及Redis在Windows下的安裝和使用教程

    這篇文章主要介紹了NoSQL和Redis簡介及Redis在Windows下的安裝和使用教程,本文同時講解了python操作redis,并給出了操作實例,需要的朋友可以參考下
    2015-01-01
  • Redis優(yōu)化經(jīng)驗總結(jié)(必看篇)

    Redis優(yōu)化經(jīng)驗總結(jié)(必看篇)

    下面小編就為大家?guī)硪黄猂edis優(yōu)化經(jīng)驗總結(jié)(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 手把手教你使用redis實現(xiàn)排行榜功能

    手把手教你使用redis實現(xiàn)排行榜功能

    使用Redis中有序集合的特性來實現(xiàn)排行榜是又好又快的選擇,一般排行榜都是有實效性的,比如“用戶積分榜”,下面這篇文章主要給大家介紹了關(guān)于使用redis實現(xiàn)排行榜功能的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • SpringBoot 開啟Redis緩存及使用方法

    SpringBoot 開啟Redis緩存及使用方法

    用redis做緩存,是因為redis有著很優(yōu)秀的讀寫能力,在集群下可以保證數(shù)據(jù)的高可用,那么今天通過本文給大家講解下SpringBoot使用Redis的緩存的方法,感興趣的朋友一起看看吧
    2021-08-08
  • CentOS系統(tǒng)安裝Redis及Redis的PHP擴展詳解

    CentOS系統(tǒng)安裝Redis及Redis的PHP擴展詳解

    這篇文章主要介紹了CentOS系統(tǒng)下安裝Redis數(shù)據(jù)的教程,以及詳解了Redis數(shù)據(jù)庫的PHP擴展,文中介紹的很詳細,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12
  • Redis高并發(fā)情況下并發(fā)扣減庫存項目實戰(zhàn)

    Redis高并發(fā)情況下并發(fā)扣減庫存項目實戰(zhàn)

    本文主要介紹了Redis高并發(fā)情況下并發(fā)扣減庫存項目實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • redis緩存與數(shù)據(jù)庫一致性的問題及解決

    redis緩存與數(shù)據(jù)庫一致性的問題及解決

    這篇文章主要介紹了redis緩存與數(shù)據(jù)庫一致性的問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • redis實現(xiàn)簡單分布式鎖

    redis實現(xiàn)簡單分布式鎖

    這篇文章主要介紹了redis實現(xiàn)簡單分布式鎖,文中通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2013-09-09
  • Redis中序列化的兩種實現(xiàn)

    Redis中序列化的兩種實現(xiàn)

    本文主要介紹了Redis中序列化的兩種實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • redis發(fā)布和訂閱_動力節(jié)點Java學(xué)院整理

    redis發(fā)布和訂閱_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細介紹了redis發(fā)布和訂閱的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論