原來大廠的Redis分布式鎖都這麼設計的!,Java基礎入門視頻教程

代碼小哥都督 2021-09-20 03:42:25 阅读数:716

redis 分布式 分布 java 教程
// 1\. 占分布式鎖,去redis占坑
Boolean lock = redisTemplate.opsForValue().setIfAbsent( "lock", "110")
if(lock) {
// 加鎖成功...執行業務
// 突然斷電
// 2\. 設置過期時間
redisTemplate.expire("lock", timeout: 30, TimeUnit.SECONDS) ;
Map<String, List<Catelog2Vo>> dataFromDb = getDataFromDb();
//删除鎖
redisTemplate. delete( key; "lock");
return dataFromDb;
} else {
// 加鎖失敗...重試。 synchronized ()
// 休眠100ms重試
// 自旋的方式
return getCatalogJsonF romDbWithRedisLock();
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

問題場景

  • setnx設置好,正要去設置過期時間,宕機,又死鎖

解决方案:設置過期時間和占比特必須是原子操作。redis支持使用setNxEx命令

階段三

原來大廠的Redis分布式鎖都這麼設計的!,Java基礎入門視頻教程_後端

// 1\. 分布式鎖占坑
Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "110", 300, TimeUnit.SECONDS);
if(lock)(
// 加鎖成功,執行業務
// 2\. 設置過期時間,必須和加鎖一起作為原子性操作
// redisTemplate. expire( "lock", з0, TimeUnit.SECONDS);
Map<String, List<Catelog2Vo>> dataFromDb = getDataFromDb();
// 删除鎖
redisTemplate.delete( key: "lock")
return dataFromDb;
else {
// 加鎖失敗,重試
// 休眠100ms重試
// 自旋
return getCatalogJsonFromDbithRedislock()
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

階段四

原來大廠的Redis分布式鎖都這麼設計的!,Java基礎入門視頻教程_Java_02

已經拿到了 lockvalue ,有了 UUID,但是過期了現在!其他人拿到所鎖設置了新值,於是 if 後將別人的鎖删了!!也就是删除鎖不是原子操作。

Map<String, List<Catelog2Vo>> dataFromDb = getDataFromDb();
String lockValue = redisTemplate.opsForValue().get("lock");
if(uuid.equals(lockValue)) {
// 删除我自己的鎖
redisTemplate.delete("lock");
}

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

問題場景

  • 如果正好判斷是當前值,正要删除鎖時,鎖已過期,別人已設置成功新值。那删除的就是別人的鎖.
  • 解决方案

删除鎖必須保證原子性。使用redis+Lua脚本。

最後

針對最近很多人都在面試,我這邊也整理了相當多的面試專題資料,也有其他大廠的面經。希望可以幫助到大家。

下面的面試題答案都整理成文檔筆記。也還整理了一些面試資料&最新2021收集的一些大廠的面試真題(都整理成文檔,小部分截圖)

 CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】

原來大廠的Redis分布式鎖都這麼設計的!,Java基礎入門視頻教程_程序員_03

最新整理電子書

原來大廠的Redis分布式鎖都這麼設計的!,Java基礎入門視頻教程_程序員_04

版权声明:本文为[代碼小哥都督]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210920034224862A.html