<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
隨著業務發展的需要,原單體單機部署的系統被演化成分散式叢集系統後,由於分散式系統多執行緒、多程序並且分佈在不同機器上,這將使原單機部署情況下的並行控制鎖策略失效,單純的Java API並不能提供分散式鎖的能力。為了解決這個問題就需要一種跨JVM的互斥機制來控制共用資源的存取,這就是分散式鎖要解決的問題!
分散式鎖主流的實現方案:
1. 基於資料庫實現分散式鎖
2. 基於快取(Redis等)
3. 基於Zookeeper
每一種分散式鎖解決方案都有各自的優缺點:
1. 效能:redis最高
2. 可靠性:zookeeper最高
這裡,我們就基於redis實現分散式鎖。
使用redis實現分散式鎖
redis:命令
# set sku:1:info “OK” NX PX 10000
EX second :設定鍵的過期時間為 second 秒。 SET key value EX second 效果等同於 SETEX key second value 。
PX millisecond :設定鍵的過期時間為 millisecond 毫秒。 SET key value PX millisecond 效果等同於 PSETEX key millisecond value 。
NX :只在鍵不存在時,才對鍵進行設定操作。 SET key value NX 效果等同於 SETNX key value 。
XX :只在鍵已經存在時,才對鍵進行設定操作。
1. 多個使用者端同時獲取鎖(setnx)
2. 獲取成功,執行業務邏輯{從db獲取資料,放入快取},執行完成釋放鎖(del)
3. 其他使用者端等待重試
Redis:
set num 0
@GetMapping("testLock") public void testLock(){ //1獲取鎖,setne Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", "111"); //2獲取鎖成功、查詢num的值 if(lock){ Object value = redisTemplate.opsForValue().get("num"); //2.1判斷num為空return if(StringUtils.isEmpty(value)){ return; } //2.2有值就轉成成int int num = Integer.parseInt(value+""); //2.3把redis的num加1 redisTemplate.opsForValue().set("num", ++num); //2.4釋放鎖,del redisTemplate.delete("lock"); }else{ //3獲取鎖失敗、每隔0.1秒再獲取 try { Thread.sleep(100); testLock(); } catch (InterruptedException e) { e.printStackTrace(); } } }
重啟,服務叢集,通過閘道器壓力測試:
ab -n 1000 -c 100 http://192.168.140.1:8080/test/testLock
檢視redis中num的值:
基本實現。
問題:setnx剛好獲取到鎖,業務邏輯出現異常,導致鎖無法釋放
解決:設定過期時間,自動釋放鎖。
優化之設定鎖的過期時間
設定過期時間有兩種方式:
1. 首先想到通過expire設定過期時間(缺乏原子性:如果在setnx和expire之間出現異常,鎖也無法釋放)
2. 在set時指定過期時間(推薦)
設定過期時間:
壓力測試肯定也沒有問題。自行測試
問題:可能會釋放其他伺服器的鎖。
場景:如果業務邏輯的執行時間是7s。執行流程如下
index1業務邏輯沒執行完,3秒後鎖被自動釋放。index2獲取到鎖,執行業務邏輯,3秒後鎖被自動釋放。index3獲取到鎖,執行業務邏輯index1業務邏輯執行完成,開始呼叫del釋放鎖,這時釋放的是index3的鎖,導致index3的業務只執行1s就被別人釋放。最終等於沒鎖的情況。
解決:setnx獲取鎖時,設定一個指定的唯一值(例如:uuid);釋放前獲取這個值,判斷是否自己的鎖
到此這篇關於redis深入淺出分散式鎖實現上篇的文章就介紹到這了,更多相關redis分散式鎖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45