分布式鎖的產生:隨著網際網路的發展,單體架構無法滿足需求,從而擴充套件成分布式架構後解決分布式情況下同步問題所產生的技術。
為什麼分布式情況下要使用分布式鎖來解決同步問題呢?
舉個例子:
分布式鎖就是用來解決上述所發生的的問題的。
分布式鎖可以通過redis和zookeeper來實現,今天我們就先聊一下redis的實現。
答:釋放鎖的**需放到finally中執行。
答:這就需要我們為鎖設定過期時間了,保證宕機後鎖還能被釋放。
(注意,設定鎖和設定過期時間的命令需通過一條指令實現,保證原子性,否則設定完鎖死機了還沒來得及設定過期時間,鎖就釋放不了了,可以通過spring封裝的stringredistemplate的setifabsent方法實現)
場景描述:a執行緒加鎖成功,但是業務執行時長超過了鎖的存活時間,鎖自動釋放,b執行緒加鎖成功後,a執行緒業務終於執行完了,此時a執行緒要釋放掉鎖,它就會把b執行緒的鎖給釋放掉了。
解決方法:每次加鎖時,可以通過uuid生成乙個隨機的value,在釋放鎖的時候判斷一下鎖當中的value和隨機生成的value是否相同,相同的話說明是自己的鎖然後進行釋放。
答:我們可以再啟動乙個執行緒,定時為我們的鎖增加存活時間,直到釋放鎖時就可以關閉該執行緒
答:這時我們就需要設定,從庫延遲重啟了,延遲的時間可以設定為鎖的存活時間,犧牲掉一些請求從而保證程式的安全性,避免發生兩個請求同時執行的情況。
我們知道鎖這個東西有利有弊,在保證了併發安全的情況下降低了程式的執行效率,所以我們可以針對不同的業務場景做優化。
eg:有這麼乙個業務,對某一商品進行庫存扣減時用到了分布式鎖。
我們可以採用分段鎖的思想來進行優化,比如現在有20件庫存,我們將它拆分到4個庫中,每個庫存放5件庫存,這樣我們的併發就能足足提公升4倍了。
現有市面上有很多基於redis的分布式鎖框架,最常見的就是redisson了,使用redisson可以很方便的使用分布式鎖,它的底層基本和上述差不多。
org.redisson
redisson
3.6.5
@autowired
private redisson redisson;
string key="分布式鎖";
rlock lock = redisson.getlock(key);//獲取鎖
lock.lock(30, timeunit.seconds);//新增鎖
lock.unlock();//釋放鎖
使用巨集鎖(傳入的鎖有一半加鎖成功,則整體加鎖成功),優化redis集群情況下,資料延遲同步問題導致的同時2個使用者加鎖成功
rlock lock1 = redisson.getlock(key);//獲取鎖
rlock lock2 = redisson.getlock(key);//獲取鎖
redissonredlock redissonredlock=new redissonredlock(lock1,lock2);//設定巨集鎖
redissonredlock.lock();//新增鎖
redissonredlock.unlock();//釋放鎖
學習筆記 分布式技術
2.redis 解耦比如說在這個專案中,客戶通過我們這個平台下訂單買車後,會發簡訊提示他,這個發簡訊的動作,如果不使用mq,要在訂單支付成功時去呼叫發簡訊的介面,然後才能返回下單成功.如果以後需求改了,不要發簡訊了,那這時候又要去改動訂單這個模組,這個設計的就很耦合.但是如果使用了mq,在下單成功後...
分布式學習筆記 分布式系統的回顧與簡介
分布式系統是乙個硬體或軟體元件分布在不同的網路計算機上,彼此之間僅僅通過訊息傳遞進行通訊和協調的系統。通俗的理解,所謂分布式系統,就是乙個業務拆分成多個子業務,分布在不同的伺服器節點,共同構成的系統稱為分布式系統,同乙個分布式系統中的伺服器節點在空間部署上是可以隨意分布的,這些伺服器可能放在不同的機...
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...