成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis怎么實現分布式鎖

存儲 存儲軟件 分布式 Redis
阿粉最近迷上了 Redis,為什么呢?感覺 Redis 確實功能很強大呀,一個基于內存的系統 Key-Value 存儲的數據庫,竟然有這么多的功能,而阿粉也要實實在在地把 Redis 來弄一下,畢竟面試的時候,Redis 可以說是一個非常不錯的加分項。

阿粉最近迷上了 Redis,為什么呢?感覺 Redis 確實功能很強大呀,一個基于內存的系統 Key-Value 存儲的數據庫,竟然有這么多的功能,而阿粉也要實實在在地把 Redis 來弄一下,畢竟面試的時候,Redis 可以說是一個非常不錯的加分項。

分布式鎖

為什么需要分布式鎖?

目前很多的大型項目全部都是基于分布式的,而分布式場景中的數據一致性問題一直是一個不可忽視的問題,大家知道關于分布式的 CAP 理論么?

CAP 理論就是說任何一個分布式系統都無法同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance),最多只能同時滿足兩項。

而我們的系統最終滿足的永遠都是最終一致性,而這種最終一致性,有些時候有人會喜歡問關于分布式事務,而有些人則偏重在分布式鎖上。

分布式鎖的種類

  1. 數據庫實現分布式鎖
  2. 緩存實現分布式鎖
  3. Zookeeper實現分布式鎖

但是阿粉選擇的就是使用緩存來實現分布式鎖,也就是我們在項目中最經常使用的 Redis ,談到 Redis,那真是可以用在太多地方了,比如說:

  • 會話緩存
  • 消息隊列
  • 分布式鎖
  • 發布,訂閱消息
  • 商品列表,評論列表

我們今天就來實現用 Redis 來實現分布式鎖,并且要學會怎么使用。

準備工作

1.準備使用 Jedis 的 jar 包,在項目中導入 jar 包。

  1. <!--jedis--> 
  2. <dependency> 
  3.     <groupId>redis.clients</groupId> 
  4.     <artifactId>jedis</artifactId> 
  5.     <version>2.9.0</version> 
  6. </dependency> 

直接來寫個工具類吧! 

  1. public class RedisPoolUtil { 
  2.  
  3.     private static final String LOCK_SUCCESS = "OK"
  4.     private static final String SET_IF_NOT_EXIST = "NX"
  5.     private static final String SET_WITH_EXPIRE_TIME = "PX"
  6.  
  7.     private RedisPoolUtil(){} 
  8.     /** 
  9.      *  
  10.      * @param jedis  
  11.      * @param lockKey 加鎖 
  12.      * @param requestId 請求的標志位 
  13.      * @param expireTime 超時時間 
  14.      * @return 
  15.      */ 
  16.     public static boolean tryGetDistributedLock(Jedis jedis,String lockKey, String requestId, int expireTime) { 
  17.  
  18.         String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); 
  19.  
  20.         if (LOCK_SUCCESS.equals(result)) { 
  21.             return true
  22.         }else
  23.             try{ 
  24.                 Thread.sleep(10);//休眠100毫秒 
  25.             }catch(Exception e){ 
  26.                 e.printStackTrace(); 
  27.             } 
  28.         } 
  29.         return false
  30.     } 

jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); 這個加鎖的姿勢才是我們最需要了解的,不然你用的時候都不知道怎么使用。

key:加鎖的鍵,實際上就是相當于一個唯一的標志位,不同的業務,你可以使用不同的標志位進行加鎖。

requestId:這個東西實際上就是用來標識他是哪一個請求進行的加鎖,因為在分布式鎖中,我們要知道一件事,就是加鎖的和解鎖的,必須是同一個客戶端才可以。

而且還有一種比較經典的就是 B 把 A 的鎖給釋放了,導致釋放混亂,如果你不加相同的請求,A 線程處理業務,執行了加鎖,鎖的過期時間是5s, B線程嘗試獲取鎖,如果 A 處理業務時間超過5s,這時候 A 就要開始釋放鎖,而B在這時候沒有檢測到這個鎖,從而進行了加鎖,這時候加鎖的時候,A還沒處理完對應業務,當他處理完了之后,再釋放鎖的話,要是就是直接把 B 剛加的鎖釋放了,要么就是壓根都沒辦法釋放鎖。

SET_IF_NOT_EXIST:看字面意思,如果 key 不存在,我們進行Set操作,如果存在,啥都不干,也就不在進行加鎖。

SET_WITH_EXPIRE_TIME:是否過期

expireTime:這是給 key 設置一個過期的時間,萬一你這業務一直被鎖著了,然后之后的業務想加鎖,你直接給一直持有這個這個鎖,不進行過期之后的釋放,那豈不是要涼了。

上面的方法中 tryGetDistributedLock 這個方法也就是我們通常使用的加鎖的方法。

解鎖 

  1. public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) { 
  2.  
  3.         String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"
  4.         Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId)); 
  5.  
  6.         if ("OK".equals(result)) { 
  7.             return true
  8.         } 
  9.         return false
  10.  
  11.     } 

大家看到這個 script的時候,會感覺有點奇怪,實際上他就是一個 Lua 的腳本,而 Lua 腳本的意思也比較簡單。

  1. 先獲取鎖對應的value值,檢查是否與requestId相等
  2. 如果相等則刪除鎖(解鎖)
  3. 執行eval()方法

其實這時候就有些人說,直接 del 刪除不行么?你試試你如果這么寫的話,你們的領導會不會把你的腿給你打斷。

這種不先判斷鎖的擁有者而直接解鎖的方式,會導致任何客戶端都可以隨時進行解鎖,也就是說,這鎖就算不是我加的,我都能開,這怎么能行呢? 

 

在這里給大家放一段使用的代碼,比較簡單,但是可以直接用到你們的項目當中。 

  1. try{ 
  2. Boolean result = RedisPoolUtil.tryGetDistributedLock(jedis, "xxxxx", uuid, 5000); 
  3.  
  4. if(result) { 
  5.         xxxx代碼片段 
  6. }else
  7.  
  8.  
  9. }catch(){ 
  10.  
  11. }finally{ 
  12. RedisPoolUtil.releaseDistributedLock(jedis,"xxxxx", uuid); 

分布式鎖的要求

  1. 滿足互斥性。也就是說不管在什么時候,只有一個客戶端能夠持有鎖,不能是多個客戶端。
  2. 不能出現死鎖。就是說,如果要實現分布式鎖,不能說當一個鎖沒有釋放的時候,其他的客戶端不能進行加鎖,要保證不影響其他的客戶端加鎖。
  3. 加鎖和解鎖必須是同一個客戶端

分布式的CAP理論

我們先把這個實現方式實現了,然后我們再來說說大家最不愿意看的理論知識,畢竟這理論知識是你面試的時候經常會被問到的。

分布式CAP理論:

加州大學伯克利分校的 Eric Brewer 教授在 ACM PODC 會議上提出 CAP 猜想。2年后,麻省理工學院的 Seth Gilbert 和 Nancy Lynch 從理論上證明了 CAP。之后,CAP 理論正式成為分布式計算領域的公認定理。

也就是說,在二十年前的時候,CAP 理論只是個猜想。結果兩年之后被證實了,于是,大家在考慮分布式的時候,就有根據來想了,不再是空想了。

什么是分布式的 CAP 理論 ?

一個分布式系統最多只能同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項。 

 

這個和(Atomicity)不太一樣,因為之前看有些人說,在 CAP 理論中的 A 和數據庫事務中的 A 是一樣的,單詞都不一樣,那能一樣么?

Availability :分布式中的 A 表示的是可用性,也就是說服務一直可用,而且是正常響應時間。

而你在搭建分布式系統的時候,要保證每個節點都是穩定的,不然你的可用性就沒有得到相對應的保證,也談不上是什么分布式了。只能稱之為一個偽分布式。

Consistency: 一致性

也就是說你的更新操作成功并返回客戶端完成后,所有節點在同一時間的數據完全一致,這個如果你在使用 Redis 做數據展示的時候,很多面試官都會問你,那你們是怎么保證數據庫和緩存的一致性的呢?

畢竟你只是讀取的話,沒什么問題,但是設計到更新的時候,不管是先寫數據庫,再刪除緩存;還是先刪除緩存,再寫庫,都有可能出現數據不一致的情況。

所以如果你對這個很感興趣,可以研究一下,比如說:

  1. 延時雙刪策略
  2. 懶加載 懶加載可采取雙刪+TTL失效來實現
  3. 主動加載

如果你能在面試的時候把這些都給面試官說清楚,至少感覺你應該能達到你自己的工資要求。

Partition tolerance:分區容錯性

分布式系統在遇到某節點或網絡分區故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。

其實在 CAP 理論當中,我們是沒有辦法同時滿足一致性、可用性和分區容錯性這三個特性,所以有所取舍就可以了。

關于使用 Redis 分布式鎖,大家學會了么?

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2023-08-21 19:10:34

Redis分布式

2019-02-26 09:51:52

分布式鎖RedisZookeeper

2019-06-19 15:40:06

分布式鎖RedisJava

2024-10-07 10:07:31

2024-04-01 05:10:00

Redis數據庫分布式鎖

2020-07-30 09:35:09

Redis分布式鎖數據庫

2020-07-15 16:50:57

Spring BootRedisJava

2023-03-01 08:07:51

2023-01-13 07:39:07

2019-12-25 14:35:33

分布式架構系統

2023-10-11 09:37:54

Redis分布式系統

2021-10-25 10:21:59

ZK分布式鎖ZooKeeper

2024-11-28 15:11:28

2022-09-19 08:17:09

Redis分布式

2020-11-16 12:55:41

Redis分布式鎖Zookeeper

2022-06-16 08:01:24

redis分布式鎖

2021-06-16 07:56:21

Redis分布式

2019-07-16 09:22:10

RedisZookeeper分布式鎖

2022-03-04 09:54:04

Redis分布式鎖腳本

2021-11-01 12:25:56

Redis分布式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 综合九九 | 五月天综合网 | 精品av久久久久电影 | 美女中文字幕视频 | 久久久久国产 | 亚洲一区二区精品视频 | 91久久精品国产91久久 | 国精产品一区一区三区免费完 | 国内自拍视频在线观看 | 欧美日韩高清 | 国产精品一卡二卡三卡 | 一区二区三区在线播放 | 超碰导航 | 国产一级免费视频 | 日韩电影免费在线观看中文字幕 | 99热精品在线 | 日日日视频 | 亚洲成人高清 | 欧美亚洲视频在线观看 | 一级高清免费毛片 | 欧美成人精品 | 亚洲国产二区 | 中文字幕国产一区 | 日韩一区二区免费视频 | 欧美一区二区激情三区 | 久久激情五月丁香伊人 | 国产99久久久国产精品 | 国产在线观看不卡一区二区三区 | 五月婷婷色 | 免费v片| 精品久久久久久久久亚洲 | 国产视频精品在线 | 日本三级精品 | 久久国产福利 | av免费电影在线 | 欧美色图另类 | 中文字幕在线免费观看 | 亚洲乱码国产乱码精品精的特点 | 亚洲色欧美另类 | 亚洲国产欧美精品 | 日韩中文字幕在线观看视频 |