新聞中心
Redis分布式鎖的原理是什么?如何續(xù)期?
分布式鎖的需求產(chǎn)生

分布式鎖的需求是伴隨著應用分布式部署而來的,在單體應用,且只部署一臺服務器的情況下,通過java的同步鎖即可實現(xiàn)。同步鎖,即是一個原子性的操作。
那么當應用進行了分布式部署,應用有多個服務,這個時候應用服務端就沒有一個可提供原子性操作的地方了,Redis性能高,且是單線程,因此可提供一個原子性操作的地方,利用它,就可以實現(xiàn)分布式鎖。
用場景說話,使用Redis分布式鎖的場景如下圖所示:
如下圖所示,隨后會根據(jù)場景說明分布式鎖及續(xù)期相關問題的來龍去脈。
- 圖中序號1:進來一個請求,這個請求要求我們保存一個“訂單A”;
- 圖中序號2:2.1 步,請求進來,首先去嘗試設置一個Redis 值,他的鍵就是訂單號“訂單A”,如果嘗試成功,則代表我這個線程是第一次設置,相當于我拿到了這個鎖;如果嘗試失敗,那么,可以拋出異?;蛘叩却欢螘r候后再次重試,這里可以根據(jù)業(yè)務場景的不同采取不同的策略。這里的關鍵是在Redis中的操作是單線程的,因此該操作是原子性的。2.2步,為了防止應用服務意外中斷,Redis中的數(shù)據(jù)一直存活,消耗資源,需要設置一個超時時間。(如果為了嚴謹,可以將2.1, 2.2 兩步封裝成一個lua腳本部署在Redis服務器上)
- 圖中序號3:情況A,這個時候是當Redis的key還未失效,程序就已經(jīng)執(zhí)行完成,且刪除了Redis中的數(shù)據(jù),一切正常;情況B:就是需要續(xù)期的場景,如果要避免這個場景的出現(xiàn),可以將Redis key的失效時間設置長一點,可以應對大多數(shù)業(yè)務。如果要徹底解決,可以在應用端添加一個Redis鎖的注冊中心,然后起一個監(jiān)聽線程去監(jiān)聽這個注冊中心,發(fā)現(xiàn)有鎖還在被持有,但是Redis 已經(jīng)快過期了,則修改相應key的失效時間,進行續(xù)期。
在傳統(tǒng)單體應用單機部署的情況下,并發(fā)問題可以通過使用Java并發(fā)相關的鎖如synchronized,但是當規(guī)模上升到分布式集群的情況下,要控制共享資源訪問,就需要通過分布式鎖來實現(xiàn)。常見的分布式鎖方案如數(shù)據(jù)庫樂觀鎖,Redis鎖,zk鎖等。
Redis分布式鎖可以有多種方式實現(xiàn)但是其核心就是通過以下三個Redis命令組合實現(xiàn)。
上面為Redis的一個最簡單的鎖實現(xiàn)原理,實際中還需要考慮更多具體的情況作出相應的調(diào)整。如
實際開發(fā)環(huán)境中不確定的因素有很多,需要慢慢地去調(diào)整實踐達到理想狀態(tài),可以考慮使用redisson框架來實現(xiàn)。
這個情況比較獨特,出現(xiàn)這個問題的根本原因在于鎖失效的時間小于業(yè)務處理的時間導致業(yè)務還沒處理完畢鎖就釋放了。那么解決方案是合理地結(jié)合業(yè)務去設置鎖失效的時間。
但是也有更好的方案就如前文提到的redisson,其中的可重入鎖概念。
默認情況下,加鎖的時間是30秒.如果加鎖的業(yè)務沒有執(zhí)行完,那么到 30-10 = 20秒的時候,就會進行一次續(xù)期,把鎖重置成30秒。
什么時候需要分布式鎖?
作為BAT的Java web開發(fā)工程師來回答這個問題。
分布式鎖是目前Java web開發(fā)過程中常見的一個情況,接下來,我從場景以及如何實現(xiàn)兩個維度來分析。
當你的后端服務是以集群形式存在的時候,是一定需要分布式鎖的。集群與分布式不同,而這里的分布式與分布式鎖也不是同一回事兒。集群可以指多臺服務器實現(xiàn)了同樣的需求,比如有三臺Tomcat,都負責查詢模塊;而分布式指多臺服務器各自不同的功能點,多臺功能的整合對外是一個完整的服務,比如一臺Tomcat負責查詢,一臺負責下單。
說回集群,當后端集群要去訪問同一個資源的時候,就需要對該資源加鎖,保證同一時刻只能有一個對象來修改該資源數(shù)據(jù),如果不加鎖會導致什么情況呢?
舉一個例子:
有兩個線程(分別叫T1,T2)做的都是同樣的事情,拿到一個叫做A的資源,然后對其進行+1操作。由于線程之間是不會互相通信的,于是就有可能出現(xiàn)下面這種情況:
T1拿到A,讀入內(nèi)存,此時A值為T;
T2拿到A,讀入內(nèi)存,此時A值為T;
T1進行+1操作,此時A實際值為T+1;
到此,以上就是小編對于redis分布式鎖失效問題的問題就介紹到這了,希望這2點解答對大家有用。
網(wǎng)頁名稱:Redis分布式鎖的原理是什么?如何續(xù)期?(redis分布式鎖發(fā)生死鎖怎么解決)
轉(zhuǎn)載來源:http://fisionsoft.com.cn/article/dpsjpso.html


咨詢
建站咨詢
