91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

基于redis的分布式鎖二種應用場景

發布時間:2020-09-21 23:56:05 來源:網絡 閱讀:286 作者:Java_老男孩 欄目:編程語言

“分布式鎖”是用來解決分布式應用中“并發沖突”的一種常用手段,實現方式一般有基于zookeeper及基于redis二種。具體到業務場景中,我們要考慮二種情況:

一、搶不到鎖的請求,允許丟棄(即:忽略)

比如:一些不是很重要的場景,比如“監控數據持續上報”,某一篇文章的“已讀/未讀”標識位更新,對于同一個id,如果并發的請求同時到達,只要有一個請求處理成功,就算成功。

用活動圖表示如下:

基于redis的分布式鎖二種應用場景

二、并發請求,不論哪一條都必須要處理的場景(即:不允許丟數據)

比如:一個訂單,客戶正在前臺修改地址,管理員在后臺同時修改備注。地址和備注字段的修改,都必須正確更新,這二個請求同時到達的話,如果不借助db的事務,很容易造成行鎖競爭,但用事務的話,db的性能顯然比不上redis輕量。

解決思路:A,B二個請求,誰先搶到分布式鎖(假設A先搶到鎖),誰先處理,搶不到的那個(即:B),在一旁不停等待重試,重試期間一旦發現獲取鎖成功,即表示A已經處理完,把鎖釋放了。這時B就可以繼續處理了。

但有二點要注意:

a、需要設置等待重試的最長時間,否則如果A處理過程中有bug,一直卡死,或者未能正確釋放鎖,B就一直會等待重試,但是又永遠拿不到鎖。

b、等待最長時間,必須小于鎖的過期時間。否則,假設鎖2秒過期自動釋放,但是A還沒處理完(即:A的處理時間大于2秒),這時鎖會因為redis key過期“提前”誤釋放,B重試時拿到鎖,造成A,B同時處理。(注:可能有同學會說,不設置鎖的過期時間,不就完了么?理論上講,確實可以這么做,但是如果業務代碼有bug,導致處理完后沒有unlock,或者根本忘記了unlock,分布式鎖就會一直無法釋放。所以綜合考慮,給分布式鎖加一個“保底”的過期時間,讓其始終有機會自動釋放,更為靠譜)

用活動圖表示如下:

基于redis的分布式鎖二種應用場景

用2個線程模擬并發場景,跑起來后,輸出如下:

基于redis的分布式鎖二種應用場景

可以看到T2線程沒搶到鎖,直接拋出了預期的異常。

把44行的注釋打開,即:換成不允許丟數據的模式,再跑一下:

基于redis的分布式鎖二種應用場景

可以看到,T1先搶到鎖,然后經過2秒的處理后,鎖釋放,這時T2重試拿到了鎖,繼續處理,最終釋放。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

手游| 康平县| 中山市| 维西| 额敏县| 静安区| 汪清县| 柘城县| 石泉县| 山东| 桑日县| 黄冈市| 张家川| 黄浦区| 临桂县| 焉耆| 广宗县| 和静县| 和顺县| 龙岩市| 松滋市| 临桂县| 清新县| 志丹县| 甘孜县| 平湖市| 永丰县| 禄丰县| 资讯| 斗六市| 安福县| 上杭县| 乌鲁木齐县| 滨海县| 贵定县| 汝城县| 磐石市| 遵义市| 嘉善县| 泸溪县| 买车|