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

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

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

Redis setNX分布式鎖超時(shí)時(shí)間失效 -1

使用SETNX加鎖

加鎖的思路:

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

使用 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è)置過期時(shí)間");
? ? ? ? }
?
? ? ? ? return "success";
? ? }

解決死鎖

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

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

@Scheduled(initialDelay = 1000,fixedDelay = 1000*60*30)
? ? public void deleteExceptionKey(){
? ? ? ? String key = "redis_nx_test";
? ? ? ??
? ? ? ? //返回 -2 ? 表示這個(gè)key已過期,已不存在
? ? ? ? //返回 -1 ? 表示這個(gè)key沒有設(shè)置有效期
? ? ? ? //返回0以上的值 ? 表示是這個(gè)key的剩余有效時(shí)間
? ? ? ? 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分布式鎖,超時(shí)問題的處理

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

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

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

1、誤刪除別人的鎖

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

解決方案:

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

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

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

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

總結(jié)

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

相關(guān)文章

  • Redis安裝與使用方法小結(jié)

    Redis安裝與使用方法小結(jié)

    這篇文章主要介紹了Redis安裝與使用方法,結(jié)合實(shí)例形式分析了Redis數(shù)據(jù)庫的下載、安裝、啟動(dòng)、設(shè)置及相關(guān)使用操作注意事項(xiàng),需要的朋友可以參考下
    2018-04-04
  • 使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例

    使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例

    為了實(shí)現(xiàn)一個(gè)實(shí)時(shí)排行榜系統(tǒng),我們可以使用Redis的有序集合,本文主要介紹了使用Redis實(shí)現(xiàn)實(shí)時(shí)排行榜的示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • 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)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 使用Redis實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制

    使用Redis實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制

    JWT是一種輕量級(jí)的身份驗(yàn)證和授權(quán)機(jī)制,它是一種 JSON 格式的數(shù)據(jù)串,通常用于客戶端和服務(wù)端之間的單點(diǎn)登錄(Single Sign-On, SSO)場(chǎng)景,本文給大家介紹了如何使用Redis來實(shí)現(xiàn)JWT令牌主動(dòng)失效機(jī)制,需要的朋友可以參考下
    2024-08-08
  • Redis事務(wù)為什么不支持回滾

    Redis事務(wù)為什么不支持回滾

    事務(wù)是關(guān)系型數(shù)據(jù)庫的特征之一,那么作為 Nosql 的代表 Redis 中有事務(wù)嗎?如果有,那么 Redis 當(dāng)中的事務(wù)又是否具備關(guān)系型數(shù)據(jù)庫的 ACID 四大特性,本文就來詳細(xì)介紹一下
    2021-08-08
  • Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟

    Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟

    這篇文章主要為大家介紹了Redis恢復(fù)被移除集群的服務(wù)器實(shí)操步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Redis如何使用lua腳本實(shí)例教程

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

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

    Redis高級(jí)用法以及golang代碼示例

    Redis是一個(gè)遠(yuǎn)程內(nèi)存數(shù)據(jù)庫,它不僅性能強(qiáng)勁,而且還具有復(fù)制特性以及為解決問題而生的獨(dú)一無二的數(shù)據(jù)模型,這篇文章主要介紹了Redis高級(jí)用法以及golang代碼示例的相關(guān)資料,需要的朋友可以參考下
    2026-01-01
  • redis數(shù)據(jù)傾斜處理方法

    redis數(shù)據(jù)傾斜處理方法

    我們?cè)谑褂肦edis分片集群時(shí),集群最好的狀態(tài)就是每個(gè)實(shí)例可以處理相同或相近比例的請(qǐng)求,但如果不是這樣,則會(huì)出現(xiàn)某些實(shí)例壓力特別大,而某些實(shí)例特別空閑的情況發(fā)生,本文就一起來看下這種情況是如何發(fā)生的以及如何處理
    2022-12-12
  • redis常用命令、常見錯(cuò)誤、配置技巧等分享

    redis常用命令、常見錯(cuò)誤、配置技巧等分享

    這篇文章主要介紹了redis常用命令、常見錯(cuò)誤、配置技巧等分享,本文分享了12條redis知識(shí),需要的朋友可以參考下
    2015-02-02

最新評(píng)論

万州区| 武安市| 天水市| 宁强县| 乌拉特前旗| 团风县| 监利县| 太和县| 保定市| 博客| 永定县| 上犹县| 武强县| 保靖县| 道真| 景德镇市| 乐山市| 武山县| 康平县| 华安县| 彩票| 文水县| 抚顺市| 云和县| 阳朔县| 东乡| 天祝| 敦煌市| 蛟河市| 盘锦市| 峨边| 思南县| 镇远县| 林周县| 孝感市| 霍山县| 玛沁县| 岢岚县| 海晏县| 固原市| 洛扎县|