分布式專題 分布式鎖

2021-09-30 16:48:41 字數 1053 閱讀 4081

在傳統的單體應用架構中,遇到併發安全性問題時我們可以通過同步鎖synchronized,同步**塊,reentrantlock等方式都可以解決,但隨著業務的發展,單體應用架構不能滿足龐大的使用者請求量,於是分布式系統應用而生,在分布式系統中,由於每個系統都執行在不同的伺服器上,有著不同的jvm,所以jdk提供的這些併發鎖都失效了,我們需要一把新的"全域性的鎖",讓所有的分布式系統共享這把鎖,這把鎖同一時間內只能被乙個系統擁有,擁有鎖的系統獲得一些相應的許可權,其它系統需要等待擁有鎖的系統釋放鎖,然後去競爭這把鎖,只有擁有這把鎖的系統才具有相應許可權.以此來解決業務上一些不安全的問題,比如超賣等.

分布式鎖的實現方式多種多樣,比較常見的是基於關係型資料庫的實現,基於快取的實現和基於zookeeper的實現.

本篇主要講基於mysql的實現,基於redis的實現和基於zookeeper的實現,其他品種的實現暫不討論.

先做一些對比,各位都是明白人,具體該什麼場景下用做完對比心裡自然有數:

從理解的難易程度角度(從低到高)

資料庫 > 快取 > zookeeper

從實現的複雜性角度(從低到高)

zookeeper > 快取 > 資料庫 (主要是因為apache在curator中已經幫我們封裝好了一套分布式鎖)

從效能角度(從低到高)

資料庫》zookeeper >快取

從可靠性角度(從低到高)

資料庫》 快取》zookeeper

從上面各種維度的對比中,很明顯,最差的就是基於mysql的實現,所以大部分場景下是不會去用mysql實現分布式鎖的,至於要不要學,就看你個人了...

標題有點繞口,說了那麼多,就一起來分別實現下這三種鎖,由於牽扯的內容有點多,而且在前面我分別講過這三種鎖的實現,這裡再寫一遍就顯得有點贅餘了,而且篇幅會太長,所以直接以超連結形式給出,可以靈活選擇自己想學的那一種實現:

①基於mysql的實現:

②基於redis的實現:

③基於zookeeper的實現:

如cap理論所述,在分布式系統中魚與熊掌是不可兼得的,所以沒有最優的實現方式,只有最適合的實現方式,所以請根據自己業務的實際需求靈活選擇用哪一種方式去實現.

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

簡單聊聊分布式鎖 Redis分布式鎖

單機redis分布式鎖 單機redis分布式鎖 首先咱們先聊聊單機的redis分布式鎖 第乙個最普通的實現方式,就是在 redis 裡使用 setnx 命令建立乙個 key,這樣就算加鎖。set resource name my random value nx px 30000執行這個命令就 ok。...