日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis做分布式锁可能不那么简单

發(fā)布時間:2025/5/22 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis做分布式锁可能不那么简单 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在計算機世界里,對于鎖大家并不陌生,在現(xiàn)代所有的語言中幾乎都提供了語言級別鎖的實現(xiàn),為什么我們的程序有時候會這么依賴鎖呢?這個問題還是要從計算機的發(fā)展說起,隨著計算機硬件的不斷升級,多核cpu,多線程,多通道等技術把計算機的計算速度大幅度提升,原來同一時間只能執(zhí)行一條cpu指令的時代已經(jīng)過去。隨著多條cpu指令可以并行執(zhí)行的原因,原來不曾出現(xiàn)的資源競爭隨著出現(xiàn),在程序中的體現(xiàn)就是隨處可見的多線程環(huán)境。比如要更新數(shù)據(jù)庫的一個信息,如果沒有并發(fā)控制,多個線程同時操作的話,就會出現(xiàn)互相覆蓋的現(xiàn)象發(fā)生。

鎖要解決的就是資源競爭的問題,也就是要把執(zhí)行的指令順序化

為什么需要分布式鎖

隨著互聯(lián)網(wǎng)的興起,現(xiàn)代軟件發(fā)生了翻天覆地的變化,以前單機的程序,已經(jīng)支撐不了現(xiàn)代的業(yè)務。無論是在抗壓,還是在高可用等方面都需要多臺計算機協(xié)同工作來解決問題。現(xiàn)代的互聯(lián)網(wǎng)系統(tǒng)都是分布式部署的,分布式部署確實能帶來性能和效率上的提升,但為此,我們就需要多解決一個分布式環(huán)境下,數(shù)據(jù)一致性的問題。

當某個資源在多系統(tǒng)之間共享的時候,為了保證大家訪問這個資源數(shù)據(jù)是一致的,那么就必須要求在同一時刻只能被一個客戶端處理,不能并發(fā)的執(zhí)行,否則就會出現(xiàn)同一時刻有人寫有人讀,大家訪問到的數(shù)據(jù)就不一致了。

在分布式系統(tǒng)的時代,傳統(tǒng)線程之間的鎖機制,就沒作用了,系統(tǒng)會有多份并且部署在不同的機器上,這些資源已經(jīng)不是在線程之間共享了,而是屬于進程(服務器)之間共享的資源。

因此,為了解決這個問題,我們就必須引入「分布式鎖」。分布式鎖,是指在分布式的部署環(huán)境下,通過鎖機制來讓多客戶端互斥的對共享資源進行訪問。分布式鎖的特點如下:

1.互斥性

和我們本地鎖一樣互斥性是最基本,但是分布式鎖需要保證在不同節(jié)點的不同線程的互斥。

2.可重入性

同一個節(jié)點上的同一個線程如果獲取了鎖之后那么也可以再次獲取這個鎖。

3.鎖超時

和本地鎖一樣支持鎖超時,防止死鎖。

4.高效,高可用

加鎖和解鎖需要高效,同時也需要保證高可用防止分布式鎖失效,可以增加降級。

5.支持阻塞和非阻塞

和 ReentrantLock 一樣支持 lock 和 trylock 以及 tryLock(long timeOut)。

基于redis分布式鎖

如果你通過網(wǎng)絡搜索分布式鎖,最多的就是基于redis的了。基于redis的分布式鎖得益于redis的單線程執(zhí)行機制,單線程在執(zhí)行上就保證了指令的順序化,所以很大程度上降低了開發(fā)人員的思考設計成本。但是,基于redis做分布式鎖難道真的這么容易嗎?

1.原子操作

基于redis的分布式鎖常用命令是

SETNX key value 復制代碼

只在鍵 key 不存在的情況下,將鍵 key的值設置為value 。若鍵key 已經(jīng)存在, 則SETNX 命令不做任何動作。SETNX 是『SET if Not eXists』(如果不存在,則 SET)的簡寫。代碼示例:

redis> SETNX redislock "redislock" # redislock 設置成功 (integer) 1redis> SETNX redislock "redislock2" # 嘗試覆蓋 redislock ,失敗 (integer) 0redis> GET redislock # 沒有被覆蓋 "redislock" 復制代碼

成功獲取到鎖之后,然后設置一個過期時間(這里避免了客戶端down掉,鎖得不到釋放的問題)

redis> expire redislock 5 復制代碼

成功拿到鎖的客戶端順利進行自己的業(yè)務,業(yè)務代碼執(zhí)行完,然后再刪除該key

redis> DEL redislock 復制代碼

如果一切都想想象的那么順利,程序員TMD就不用996了。假如客戶端拿到鎖之后,執(zhí)行設置超時指令之前down掉了(現(xiàn)實總是那么悲劇),那這個鎖就永遠都釋放不了.也許你會想到用 Redis 事務來解決。但是這里不行,因為 expire 是依賴于 setnx 的執(zhí)行結果的,如果 setnx 沒搶到鎖,expire 是不應該執(zhí)行的。事務里沒有 if-else 分支邏輯,事務的特點是一口氣執(zhí)行,要么全部執(zhí)行要么一個都不執(zhí)行。公司幾個億的業(yè)務又被你耽誤了...

以上情況的出現(xiàn)是因為兩個命令并非一個原子性操作,所以在redis 2.8 版本之后出現(xiàn)了新的命令

SETEX key seconds value 復制代碼

所以現(xiàn)在可以利用一條原子性操作的命令來獲取鎖

redis> SETEX redislock 60 redislock OKredis> GET redislock # 值 "redislock"redis> TTL redislock # 剩余生存時間 (integer) 49 復制代碼

2.超時問題

在正常的業(yè)務當中,當一個線程獲取到鎖并且設置了鎖的過期時間之后,會出現(xiàn)由于業(yè)務代碼執(zhí)行時間過長,鎖由于到達超時時間自動釋放的情況。自動釋放之后,其他的線程就會獲取到分布式鎖,導致業(yè)務代碼不會串行執(zhí)行。如果業(yè)務上允許這樣的情況偶爾發(fā)生,那程序員就開干吧,最后頂多人工干預一下,update 一下數(shù)據(jù)庫。

為了避免這類情況發(fā)生,在使用redis分布式鎖的時候,業(yè)務方應盡量避免長時間執(zhí)行的代碼任務。

如果設置鎖的超時時間比較長,在一定程度上可以緩解業(yè)務代碼執(zhí)行時間長鎖自動到期的問題,但是一旦業(yè)務代碼down掉,其他等待鎖的線程等待的時間會比較長,這種情況下,確保獲取到鎖的程序不會down 成為了主要問題。

3.獲取鎖失敗

當鎖被一個調(diào)用方獲取之后,其他調(diào)用方在獲取鎖失敗之后,是繼續(xù)輪詢還是直接業(yè)務失敗呢?如果是繼續(xù)輪詢的話,同步情況下當前線程會一直處于阻塞狀態(tài),所以這里輪詢的情況還是建議使用異步。

4.可重入性

可重入性是指已經(jīng)擁有鎖的客戶端再次請求加鎖,如果鎖支持同一個客戶端重復加鎖,那么這個鎖就是可重入的。如果基于redis的分布式鎖要想支持可重入性,需要客戶端封裝,可以使用threadlocal存儲持有鎖的信息。這個封裝過程會增加代碼的復雜度,所以菜菜不推薦這樣做。

5.redis掛了

如果在多個客戶端獲取鎖的過程中,redis掛了怎么辦呢?假如一個客戶端已經(jīng)獲取到了鎖,這個時候redis掛了(假如是redis集群),其他的redis服務器會接著提供服務,這個時候其他客戶端可以在新的服務器上獲取到鎖了,這也導致了鎖意義的丟失。有興趣的同學可以去看看RedLock,這種方案以犧牲性能的代價解決了這個問題。

6.時鐘跳躍問題

在某些時候,redis的服務器時間發(fā)生的跳躍,由于鎖的過期時間依賴于服務器時間,所以也會出現(xiàn)兩個客戶端同時獲取到鎖的情況發(fā)生。

當把以上問題都有解決方案了之后,基于redis的分布式鎖才可以放心使用

基于redis設計簡單分布式鎖容易,但是設計完美分布式鎖不易, 還覺得基于redis的分布式鎖好做嗎?

本文到此結束! 喜歡的朋友幫忙點點贊和關注支持下!! 謝謝!

轉(zhuǎn)載于:https://juejin.im/post/5ccee4e36fb9a0320d60fdad

總結

以上是生活随笔為你收集整理的redis做分布式锁可能不那么简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美影院 | av网站免费在线 | 在线观看污污网站 | 国产高清精品一区二区三区 | 啪啪.com | 精品人妻人伦一区二区有限公司 | 国产午夜精品一区二区三区视频 | 密桃成熟时在线观看 | 爱爱爱免费视频 | 人妻奶水人妻系列 | 成年人看的视频网站 | 欧美视频在线观看一区 | 无码黑人精品一区二区 | 亚洲无毛视频 | 91打屁股| 天海翼av在线播放 | 色哟哟在线视频 | 欧美成人一区二区三区片免费 | 久久99精品久久久水蜜桃 | 国产黄色的视频 | 日本一级三级三级三级 | 成人免费在线小视频 | 日韩国产中文字幕 | 久久国产资源 | 91精品人妻一区二区三区果冻 | 国产在线看片 | 国产黄色高清视频 | 国模av| 国产精品日韩av | 男女www视频 | 日日夜夜精| 男人干女人视频 | 日韩无码电影 | 亚洲国产无码精品 | 91鲁| 欧美大片视频在线观看 | 国产免费福利 | 欧美伦理片 | 亚洲综合无码一区二区 | 免费毛片基地 | 大片视频免费观看视频 | 日韩欧美视频网站 | 牛牛精品视频 | caoprom在线视频 | 男人av影院| 少妇高潮久久久久久潘金莲 | 美女的隐私免费看 | 欧美第一页草草影院 | 亚洲色图40p | 中国女人高潮hd | 色婷婷久久五月综合成人 | 性欧美ⅴideo另类hd | 五月综合激情网 | 欧美视频1区 | 国产污污网站 | 国产精品中文字幕在线观看 | 精品久久久久一区二区国产 | 日韩精品视频免费看 | www.四虎. | 日本美女动态 | 秋霞视频在线观看 | 亚洲综合在线五月 | 色多多视频在线观看 | 在线视频日韩精品 | 免费av网址在线 | 午夜激情视频网 | 日本中文不卡 | 欧美成人久久 | 日韩一片| 黄色男同视频 | 三上悠亚ed2k | 国产永久免费视频 | 精品人妻无码在线 | 人人澡人人透人人爽 | 欧美人妖另类 | 亚洲av无一区二区三区久久 | 久草手机在线观看 | 伊人久久网站 | 台湾chinesehdxxxx少妇 | 熟妇人妻中文字幕 | 欧美日本一道 | 亚洲自拍偷拍网站 | 久久久久久久久久影院 | 亚洲人妻一区二区 | 日日弄天天弄美女bbbb | 久久天堂av综合合色蜜桃网 | 熟女高潮一区二区三区视频 | 国产精品香蕉在线 | 131美女爱做视频 | 在线观看av资源 | 男女一起插插插 | 麻豆免费在线视频 | 修女也疯狂3免费观看完整版 | 99国产精品99久久久久久 | 国产xxxx做受视频 | 国产精品国产三级国产三级人妇 | 男生看的污网站 | 操操操日日日 | 欧美又黑又粗 |