最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

我們可以使用redis來(lái)完成占坑這個(gè)操作;

基礎(chǔ)版加鎖

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

//填坑
redis.delete(lock)
}

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

獲取鎖的時(shí)候需要給鎖添加過(guò)期時(shí)間

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

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

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

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

釋放鎖:

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

在釋放鎖的時(shí)候,如果判斷key值吻合,但此時(shí)key過(guò)期了,鎖被別人獲取到,此時(shí)再刪除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í)間過(guò)長(zhǎng),鎖提前過(guò)期釋放了怎么辦

  • 將過(guò)期時(shí)間設(shè)置的長(zhǎng)一點(diǎn)
  • 需要給鎖添加續(xù)期功能。

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

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

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

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

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

redLock

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

參考

原來(lái)大廠Redis分布式鎖都這么設(shè)計(jì)的

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

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

相關(guān)文章

  • Redis系列之底層數(shù)據(jù)結(jié)構(gòu)SDS詳解

    Redis系列之底層數(shù)據(jù)結(jié)構(gòu)SDS詳解

    SDS(簡(jiǎn)單動(dòng)態(tài)字符串)是Redis使用的核心數(shù)據(jù)結(jié)構(gòu),用于替代C語(yǔ)言的字符串,以解決長(zhǎng)度獲取慢、內(nèi)存溢出等問(wèn)題,SDS通過(guò)預(yù)分配與惰性釋放策略優(yōu)化內(nèi)存使用,增強(qiáng)安全性,且能存儲(chǔ)文本與二進(jìn)制數(shù)據(jù),可查看源碼src/sds.h和src/sds.c了解更多
    2024-11-11
  • Redis如何使用lua腳本實(shí)例教程

    Redis如何使用lua腳本實(shí)例教程

    這篇文章主要給大家介紹了關(guān)于Redis如何使用lua腳本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • 如何高效使用Redis作為L(zhǎng)RU緩存

    如何高效使用Redis作為L(zhǎng)RU緩存

    這篇文章主要介紹了如何高效使用Redis作為L(zhǎng)RU緩存,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 詳解Redis SCAN命令實(shí)現(xiàn)有限保證的原理

    詳解Redis SCAN命令實(shí)現(xiàn)有限保證的原理

    這篇文章主要介紹了Redis SCAN命令實(shí)現(xiàn)有限保證的原理,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • CentOS6.4 安裝Redis 教程詳解

    CentOS6.4 安裝Redis 教程詳解

    這篇文章主要介紹了CentOS6.4 安裝Redis 教程詳解,需要的朋友可以參考下
    2017-05-05
  • Redis底層數(shù)據(jù)結(jié)構(gòu)SkipList的實(shí)現(xiàn)

    Redis底層數(shù)據(jù)結(jié)構(gòu)SkipList的實(shí)現(xiàn)

    本文主要介紹了Redis底層數(shù)據(jù)結(jié)構(gòu)SkipList的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Redis的Expire與Setex區(qū)別說(shuō)明

    Redis的Expire與Setex區(qū)別說(shuō)明

    這篇文章主要介紹了Redis的Expire與Setex區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Redis調(diào)用Lua腳本及使用場(chǎng)景快速掌握

    Redis調(diào)用Lua腳本及使用場(chǎng)景快速掌握

    Redis?是一種非常流行的內(nèi)存數(shù)據(jù)庫(kù),常用于數(shù)據(jù)緩存與高頻數(shù)據(jù)存儲(chǔ)。大多數(shù)開(kāi)發(fā)人員可能聽(tīng)說(shuō)過(guò)redis可以運(yùn)行?Lua?腳本,但是可能不知道redis在什么情況下需要使用到Lua腳本
    2022-03-03
  • 詳解用Redis實(shí)現(xiàn)Session功能

    詳解用Redis實(shí)現(xiàn)Session功能

    本篇文章主要介紹了用Redis實(shí)現(xiàn)Session功能,具有一定的參考價(jià)值,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。
    2016-12-12
  • redis生成全局id的實(shí)現(xiàn)步驟

    redis生成全局id的實(shí)現(xiàn)步驟

    生成全局唯一的標(biāo)識(shí)符是非常常見(jiàn)的需求,本文主要介紹了redis生成全局id的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-05-05

最新評(píng)論

柳江县| 即墨市| 静宁县| 塔河县| 上饶县| 濉溪县| 依兰县| 甘德县| 天柱县| 通江县| 西峡县| 科尔| 交口县| 武宣县| 茌平县| 瑞丽市| 科尔| 安仁县| 咸宁市| 沂水县| 伊金霍洛旗| 全州县| 金塔县| 汉中市| 吉林省| 汶川县| 格尔木市| 会宁县| 新昌县| 武夷山市| 玉溪市| 上虞市| 甘洛县| 房山区| 乌苏市| 会宁县| 盐池县| 阿拉善右旗| 崇州市| 鹤壁市| 清丰县|