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

Redis的setNX分布式鎖超時時間失效 -1問題及解決

 更新時間:2023年01月09日 15:08:46   作者:終遇你..  
這篇文章主要介紹了Redis的setNX分布式鎖超時時間失效 -1問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Redis setNX分布式鎖超時時間失效 -1

使用SETNX加鎖

加鎖的思路:

如果 key 不存在,將 key 設(shè)置為 value,如果 key 已存在,則 SETNX 不做任何動作。

使用 RedisTemplate 操作Redis

? ? @Autowired
? ? private RedisTemplate redisTemplate;
?
? ? @RequestMapping("/setNx")
? ? public String setNx() {
? ? ? ? String key = "redis_nx_test";
? ? ? ? String value = "1";
?
? ? ? ? boolean res = redisTemplate.getConnectionFactory().getConnection().setNX(key.getBytes(), value.getBytes());
? ? ? ? log.info("setNX:{}", res);
? ? ? ? if (res) {
? ? ? ? ? ? redisTemplate.getConnectionFactory().getConnection().expire(key.getBytes(), 50);
? ? ? ? ? ? log.info("設(shè)置過期時間");
? ? ? ? }
?
? ? ? ? return "success";
? ? }

解決死鎖

考慮一種情況,如果進程獲得鎖后,斷開了與 Redis 的連接(可能是進程掛掉,或者網(wǎng)絡(luò)中斷),如果沒有有效的釋放鎖的機制,那么其他進程都會處于一直等待的狀態(tài),即出現(xiàn)“死鎖”。

目前考慮是使用定時任務(wù)進行掃描處理超時時間為 -1的key

@Scheduled(initialDelay = 1000,fixedDelay = 1000*60*30)
? ? public void deleteExceptionKey(){
? ? ? ? String key = "redis_nx_test";
? ? ? ??
? ? ? ? //返回 -2 ? 表示這個key已過期,已不存在
? ? ? ? //返回 -1 ? 表示這個key沒有設(shè)置有效期
? ? ? ? //返回0以上的值 ? 表示是這個key的剩余有效時間
? ? ? ? Long l = redisTemplate.opsForValue().getOperations().getExpire(key);
? ? ? ? log.info("Expire:{}", l);
? ? ? ? if(l == -1){
? ? ? ? ? ?Boolean b = ?redisTemplate.delete(key);
? ? ? ? ? ? log.info("刪除key:{},{}", key,b);
? ? ? ? }
? ? }

Redis分布式鎖,超時問題的處理

分布式鎖超時問題解決方案,主要是基于redission。Redisson是架設(shè)在Redis基礎(chǔ)上的一個Java駐內(nèi)存數(shù)據(jù)網(wǎng)格(In-Memory Data Grid)。充分的利用了Redis鍵值數(shù)據(jù)庫提供的一系列優(yōu)勢,基于Java實用工具包中常用接口,為使用者提供了一系列具有分布式特性的常用工具類。

redis實現(xiàn)分布式鎖,主要是通過SETNX命令,設(shè)置一組 key,value。在同一時刻只能有一個線程設(shè)置成功,該線程獲得了分布式鎖。

分布式可能會出現(xiàn)的超時問題

1、誤刪除別人的鎖

A獲取鎖后,事務(wù)執(zhí)行超時。鎖到期自動釋放,B線程獲取到鎖。A完成事務(wù)后,釋放鎖時,把B的鎖釋放了。

解決方案:

每個線程在獲取鎖式,在寫key-value時,將自己生成的一個獨一無二的id寫入value。先校驗value,再刪除鎖。這兩個操作要保證原子性,可以采用Lua腳本。

(如果沒有保證原子性,會出現(xiàn)A校驗完value,鎖失效。B寫入key-value。A刪除B寫入的鎖。)

2、A到期自動釋放鎖后,B獲得鎖。出現(xiàn)兩個鎖并行的情況

A獲取鎖后,開啟一個守護線程,定期為A刷新鎖的時間。這樣A就是一直保持鎖的情況。在redission源碼中有相應(yīng)的程序。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • win 7 安裝redis服務(wù)【筆記】

    win 7 安裝redis服務(wù)【筆記】

    Redis是一個開源的使用ANSI C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫,并提供多種語言的API。
    2016-05-05
  • 詳解基于redis實現(xiàn)的四種常見的限流策略

    詳解基于redis實現(xiàn)的四種常見的限流策略

    限流算法在分布式領(lǐng)域是一個經(jīng)常被提起的話題,當(dāng)系統(tǒng)的處理能力有限時, 如何阻止計劃外的請求繼續(xù)對系統(tǒng)施壓,這是一個需要重視的問題。除了控制流量,限流還有一個應(yīng)用目的是控制用戶行為,避免垃圾請求
    2021-06-06
  • 基于Redis無序集合如何實現(xiàn)禁止多端登錄功能

    基于Redis無序集合如何實現(xiàn)禁止多端登錄功能

    這篇文章主要給你大家介紹了關(guān)于基于Redis無序集合如何實現(xiàn)禁止多端登錄功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 基于Redis實現(xiàn)基本搶紅包算法詳解

    基于Redis實現(xiàn)基本搶紅包算法詳解

    [key, value]的緩存數(shù)據(jù)庫, Redis官方性能描述非常高, 所以面對高并發(fā)場景, 使用Redis來克服高并發(fā)壓力是一個不錯的手段, 本文主要基于Redis來實現(xiàn)基本的搶紅包系統(tǒng)設(shè)計,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Redis持久化深入詳解

    Redis持久化深入詳解

    這篇文章主要介紹了Redis持久化深入詳解,講解的還是比較詳細的,有感興趣的同學(xué)可以學(xué)習(xí)下
    2021-03-03
  • antd為Tree組件標題附加操作按鈕功能

    antd為Tree組件標題附加操作按鈕功能

    這篇文章主要介紹了antd為Tree組件標題附加操作按鈕功能,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Redis并發(fā)訪問問題詳細講解

    Redis并發(fā)訪問問題詳細講解

    本文主要介紹了Redis如何應(yīng)對并發(fā)訪問,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-12-12
  • 解析高可用Redis服務(wù)架構(gòu)分析與搭建方案

    解析高可用Redis服務(wù)架構(gòu)分析與搭建方案

    我們按照由簡至繁的步驟,搭建一個最小型的高可用的Redis服務(wù)。 本文通過四種方案給大家介紹包含每種方案的優(yōu)缺點及詳細解說,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-06-06
  • 基于Redis位圖實現(xiàn)系統(tǒng)用戶登錄統(tǒng)計

    基于Redis位圖實現(xiàn)系統(tǒng)用戶登錄統(tǒng)計

    這篇文章主要介紹了基于Redis位圖實現(xiàn)系統(tǒng)用戶登錄統(tǒng)計,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • Redis分布式鎖的7種實現(xiàn)

    Redis分布式鎖的7種實現(xiàn)

    這篇文章主要介紹了Redis分布式鎖的實現(xiàn)
    2022-04-04

最新評論