国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Redis 分布式鎖存在什么問題 ?如何解決 ?

這篇具有很好參考價值的文章主要介紹了Redis 分布式鎖存在什么問題 ?如何解決 ?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄

1. 如何實現(xiàn)分布式鎖

2. Redis 分布式鎖存在什么問題

2.1 解決死鎖問題

2.2 解決鎖誤刪問題


1. 如何實現(xiàn)分布式鎖

Redis 天生就可以作為一個分布式系統(tǒng)來使用,所以它實現(xiàn)的鎖都是分布式鎖。

Redis 分布式鎖存在什么問題 ?如何解決 ?,redis,redis,分布式

Redis 可以通過 setnx(set if not exists)命令實現(xiàn)分布式鎖~

  • setnx mylock true? -? 加鎖
  • del mylock? -? 釋放鎖

Redis 分布式鎖存在什么問題 ?如何解決 ?,redis,redis,分布式

通過執(zhí)行結(jié)果是否為 1 可以判斷是否成功獲取到鎖~

2. Redis 分布式鎖存在什么問題

Redis 分布式鎖存在兩個問題:

1.死鎖問題:未設(shè)置過期時間,鎖忘記釋放加鎖后還沒來的及釋放鎖就宕機(jī)了都會導(dǎo)致死鎖問題.

2. 鎖誤刪問題:設(shè)置了超時時間,但是線程執(zhí)行超過超時時間后鎖誤刪問題.

2.1 解決死鎖問題

????????MySQL 中解決死鎖問題是通過設(shè)置超時時間,Redis 也是如此,但是問題來了,第一步先加鎖,然后再設(shè)置超時時間,那么就不滿足原子性了,那么怎么辦 ?

????????官方在 Redis 2.6.12 版本之后,新增了一個功能,我們可以使用一條命令既執(zhí)行加鎖操作,又設(shè)置超時時間:setnx expire

Redis 分布式鎖存在什么問題 ?如何解決 ?,redis,redis,分布式

  • 第一條命令成功加鎖,并設(shè)置 30 s 過期時間
  • 第二條命令跟在第一條命令后,還沒有超過 30s,所以獲取失敗

2.2 解決鎖誤刪問題

鎖誤刪問題是解決死鎖問題帶來的問題,如何理解 ?

Redis 分布式鎖存在什么問題 ?如何解決 ?,redis,redis,分布式

既然知道了什么是鎖誤刪問題,那么如何解決 ?

答:可以通過添加鎖標(biāo)識來解決.

????????前面我們使用 set 命令的時候,只使用到了 key,那么可以給?value 設(shè)置一個標(biāo)識,表示當(dāng)前鎖歸屬于那個線程,例如 value=thread1,value=thread2.....

但是這樣解決依然存在問題,因為新增鎖標(biāo)識之后,線程在釋放鎖的時候,需要執(zhí)行兩步操作了:

  1. 判斷鎖是否屬于自己
  2. 如果是,就刪除鎖

這樣就不能保證原子性了,那該怎么辦?

【解決方案】

  1. 使用 lua 腳本來解決 (Redis 本身就能保證 lua 腳本里面所有命令都是原子性操作)
  2. 使用 Redisson 框架來解決(主流)

那么 Redisson 如何實現(xiàn)分布式鎖呢 ?

【代碼示例】

1.引入 Redisson?依賴

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson-spring-boot-starter</artifactId>
    <version>3.23.2</version>
</dependency>

2.創(chuàng)建 RedissonClient 對象

@Configuration
public class RedissonConfig {
    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        // 如果有密碼需要設(shè)置密碼
        return Redisson.create(config);
    }
}

3.調(diào)用分布式鎖

@RestController
public class LockController {
    @Resource
    private RedissonClient redissonClient;

    @RequestMapping("/lock")
    public String lockResource() throws InterruptedException {
        String lockKey = "myLock";
        // 獲取鎖
        RLock lock = redissonClient.getLock(lockKey);
        try {
            // 超時時間 10s, [tryLock 獲取成功才需要釋放鎖,獲取失敗不需要釋放鎖]
            boolean isLocked = lock.tryLock(20, TimeUnit.SECONDS);
            if(isLocked) {
                // 成功獲取到鎖
                try {
                    TimeUnit.SECONDS.sleep(5);
                    return "成功獲取到鎖,并執(zhí)行業(yè)務(wù)代碼";
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    // 釋放鎖
                    lock.unlock();
                }
            } else {
                // 獲取鎖失敗
                return "獲取鎖失敗";
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "獲取鎖成功";
    }
}

啟動項目,使用 8080 端口訪問接口:

Redis 分布式鎖存在什么問題 ?如何解決 ?,redis,redis,分布式文章來源地址http://www.zghlxwxcb.cn/news/detail-665503.html


到了這里,關(guān)于Redis 分布式鎖存在什么問題 ?如何解決 ?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 我是如何用 redis 分布式鎖來解決線上歷史業(yè)務(wù)問題的

    我是如何用 redis 分布式鎖來解決線上歷史業(yè)務(wù)問題的

    近期發(fā)現(xiàn),開發(fā)功能的時候發(fā)現(xiàn)了一個 mq 消費(fèi)順序錯亂(歷史遺留問題),導(dǎo)致業(yè)務(wù)異常的問題,看看我是如何解決的 首先,簡單介紹一下情況: 線上 k8s 有多個 pod 會去消費(fèi) mq 中的消息,可是生產(chǎn)者發(fā)送的消息是期望一定要有序去消費(fèi),此時要表達(dá)的是,例如 生產(chǎn)者如果

    2024年02月09日
    瀏覽(20)
  • Redis實現(xiàn)方式開啟新篇章,解決分布式環(huán)境下的資源競爭問題,提升系統(tǒng)穩(wěn)定性

    Redis實現(xiàn)方式開啟新篇章,解決分布式環(huán)境下的資源競爭問題,提升系統(tǒng)穩(wěn)定性

    分布式鎖一般有三種實現(xiàn)方式: 數(shù)據(jù)庫樂觀鎖; 基于Redis的分布式鎖; 基于ZooKeeper的分布式鎖 本篇博客將介紹第二種方式,基于Redis實現(xiàn)分布式鎖。 雖然網(wǎng)上已經(jīng)有各種介紹Redis分布式鎖實現(xiàn)的博客,然而他們的實現(xiàn)卻有著各種各樣的問題,為了避免誤人子弟,本篇博客將

    2024年02月07日
    瀏覽(28)
  • Redis分布式問題

    Redis分布式問題

    ??Redis為單進(jìn)程單線程模式,采用隊列模式將并發(fā)訪問變成串行訪問,且多客戶端對Redis的連接并不存在競爭關(guān)系Redis中可以使用SETNX命令實現(xiàn)分布式鎖。當(dāng)且僅當(dāng) key 不存在,將 key 的值設(shè)為 value。 若給定的 key 已經(jīng)存在,則SETNX 不做任何動作SETNX 是『SET if Not eXists』(如果不

    2024年02月09日
    瀏覽(24)
  • Redis分布式鎖問題

    1、業(yè)務(wù)單機(jī)情況下 ? ? ? ? 問題:并發(fā)沒有加鎖導(dǎo)致線程安全問題。 ? ? ? ? 解決方法:加鎖處理,如lock、 synchronized ? ? ? ? 仍有問題:業(yè)務(wù)分布式情況下,代碼級別加鎖已經(jīng)無效。需要借助第三方組件,如redis、zookeeper。 2、業(yè)務(wù)分布式情況下,使用redis的setNX,實現(xiàn)加

    2024年02月13日
    瀏覽(22)
  • Redis進(jìn)階:分布式鎖問題

    Redis進(jìn)階:分布式鎖問題

    單機(jī)單體中的鎖機(jī)制在分布式集群系統(tǒng)中失效; 單純的Java API并不能提供分布式鎖的能力,為了解決這個問題就需要一種跨JVM的互斥機(jī)制來控制共享資源的訪問; 1.2.1 分布式鎖主流的實現(xiàn)方案 基于數(shù)據(jù)庫實現(xiàn)分布式鎖; 基于 緩存(Redis等),性能最高 ; 基于Zookeeper,可靠

    2024年02月08日
    瀏覽(18)
  • Zookeeper 和 Redis 哪種更好? 為什么使用分布式鎖? 1. 利用 Redis 提供的 第二種,基于 ZK 實現(xiàn)分布式鎖的落地方案 對于 redis 的分布式鎖而言,它有以下缺點(diǎn):

    關(guān)于這個問題,我們 可以從 3 個方面來說: 為什么使用分布式鎖? 使用分布式鎖的目的,是為了保證同一時間只有一個 JVM 進(jìn)程可以對共享資源進(jìn)行操作。 根據(jù)鎖的用途可以細(xì)分為以下兩類: 允許多個客戶端操作共享資源,我們稱為共享鎖 這種鎖的一般是對共享資源具有

    2024年01月16日
    瀏覽(24)
  • redis如何實現(xiàn)分布式鎖?

    首先,“分布式鎖”的概念,是相對“本地鎖”而言。 本地鎖比如java中的synchronized 這類 JDK 自帶的 本地鎖 ,來控制一個 JVM 進(jìn)程內(nèi)的多個線程對本地共享資源的訪問。 同一時刻只有一個線程可以獲取到本地鎖訪問共享資源。 分布式系統(tǒng)下,不同的服務(wù)/客戶端通常運(yùn)

    2024年02月06日
    瀏覽(22)
  • 什么是分布式系統(tǒng),如何學(xué)習(xí)分布式系統(tǒng)

    什么是分布式系統(tǒng),如何學(xué)習(xí)分布式系統(tǒng)

    正文 雖然本人在前面也寫過好幾篇分布式系統(tǒng)相關(guān)的文章,主要包CAP理論,分布式儲存與分布式事務(wù),但對于分布式系統(tǒng),并沒有一個跟清晰的概念。分布式系統(tǒng)涉及到很多的技術(shù)、理論與協(xié)議,很多人也說,分布式系統(tǒng)是“入門容易,深入難”,我之前的學(xué)習(xí)也只算是管中

    2024年02月13日
    瀏覽(26)
  • Redis 分布式鎖解決方案

    Redis 分布式鎖解決方案

    我們?nèi)粘T陔娚叹W(wǎng)站購物時經(jīng)常會遇到一些高并發(fā)的場景,例如電商 App 上經(jīng)常出現(xiàn)的秒殺活動、限量優(yōu)惠券搶購,還有我們?nèi)ツ膬壕W(wǎng)的火車票搶票系統(tǒng)等,這些場景有一個共同特點(diǎn)就是訪問量激增,雖然在系統(tǒng)設(shè)計時會通過限流、異步、排隊等方式優(yōu)化,但整體的并發(fā)還是

    2023年04月22日
    瀏覽(27)
  • 如何使用 Redis 快速實現(xiàn)分布式鎖?

    如何使用 Redis 快速實現(xiàn)分布式鎖?

    本文我們來討論如何使用 Redis 快速實現(xiàn)分布式鎖。 分布式鎖有很多種解決方案,前面簡單介紹過,Redis 可以通過 set key 方式來實現(xiàn)分布式鎖,但實際情況要更加復(fù)雜,比如如何確保臨界資源的串行執(zhí)行,如何及時釋放,都是需要額外考慮的。 本文要講的是一個完備的分布式

    2024年02月04日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包