久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

redis分布式鎖的實現(xiàn)原理是什么

126次閱讀
沒有評論

共計 1692 個字符,預(yù)計需要花費 5 分鐘才能閱讀完成。

自動寫代碼機器人,免費開通

這篇文章主要講解了“redis 分布式鎖的實現(xiàn)原理是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“redis 分布式鎖的實現(xiàn)原理是什么”吧!

借助于 redis 中的命令 setnx(key, value),key 不存在就新增,存在就什么都不做。同時有多個客戶端發(fā)送 setnx 命令,只有一個客戶端可以成功,返回 1(true);其他的客戶端返回 0(false)。

本教程操作環(huán)境:windows7 系統(tǒng)、Redis5.0.10 版、DELL G3 電腦。

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

隨著業(yè)務(wù)發(fā)展的需要,原單體單機部署的系統(tǒng)被演化成分布式集群系統(tǒng)后,由于分布式系統(tǒng)多線程、多進程并且分布在不同機器上,這將使原單機部署情況下的并發(fā)控制鎖策略失效,單純的 Java API 并不能提供分布式鎖的能力。為了解決這個問題就需要一種跨 JVM 的互斥機制來控制共享資源的訪問,這就是分布式鎖要解決的問題!

分布式鎖主流的實現(xiàn)方案:

基于數(shù)據(jù)庫實現(xiàn)分布式鎖

基于緩存(Redis 等)

基于 Zookeeper

這里,我們就基于 redis 實現(xiàn)分布式鎖。

基本實現(xiàn)

借助于 redis 中的命令 setnx(key, value),key 不存在就新增,存在就什么都不做。同時有多個客戶端發(fā)送 setnx 命令,只有一個客戶端可以成功,返回 1(true);其他的客戶端返回 0(false)。

redis 分布式鎖的實現(xiàn)原理是什么

主要使用 Redis Setnx 命令

在指定的 key 不存在時,為 key 設(shè)置指定的值

設(shè)置成功,返回 1。設(shè)置失敗,返回 0

redis  EXISTS job # job  不存在
(integer) 0
 
redis  SETNX job  programmer  # job  設(shè)置成功
(integer) 1
 
redis  SETNX job  code-farmer  #  嘗試覆蓋  job ,失敗
(integer) 0
 
redis  GET job #  沒有被覆蓋
 programmer

java 代碼

public void testLock() {
 //  執(zhí)行 redis 的 setnx 命令
 String uuid = UUID.randomUUID().toString();
 Boolean lock = redisTemplate.opsForValue().setIfAbsent( lock , uuid, 5, TimeUnit.SECONDS);
 
 //  判斷是否拿到鎖
 if (lock) {
 //  執(zhí)行業(yè)務(wù)邏輯代碼
 // ...
 
 //  釋放鎖資源  (保證獲取值和刪除操作的原子性) LUA 腳本保證刪除的原子性
 String script =  if redis.call(get , KEYS[1]) == ARGV[1] then
 return redis.call(del , KEYS[1]) else return 0 end 
 this.redisTemplate.execute(new DefaultRedisScript (script), 
Arrays.asList(lock), Arrays.asList(uuid));
// if (StrUtil.equals(uuid,redisTemplate.opsForValue().get(lock))){// redisTemplate.delete( lock} else {
 //  其他請求嘗試獲取鎖
 testLock();}

為了確保分布式鎖可用,我們至少要確保鎖的實現(xiàn)同時滿足以下四個條件:

互斥性。在任意時刻,只有一個客戶端能持有鎖。

不會發(fā)生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證后續(xù)其他客戶端能加鎖。

解鈴還須系鈴人。加鎖和解鎖必須是同一個客戶端,客戶端自己不能把別人加的鎖給解了。

感謝各位的閱讀,以上就是“redis 分布式鎖的實現(xiàn)原理是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對 redis 分布式鎖的實現(xiàn)原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向 AI 問一下細節(jié)

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-04發(fā)表,共計1692字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 尤溪县| 定结县| 江永县| 广汉市| 南和县| 甘孜县| 刚察县| 科技| 静宁县| 台东市| 营山县| 红安县| 抚宁县| 宜君县| 松溪县| 托克逊县| 湖北省| 海兴县| 溧水县| 乐业县| 高尔夫| 仙桃市| 化州市| 兴义市| 同心县| 双柏县| 大名县| 报价| 屏东市| 白朗县| 华坪县| 伽师县| 托里县| 重庆市| 镇坪县| 通城县| 太仆寺旗| 壶关县| 台前县| 北宁市| 陆良县|