在去除原有synchronized單機鎖後,在關鍵步驟新增分布式鎖來對具體業務進行鎖定,然而由於鎖定範圍大,導致鎖競爭增加,不斷發生鎖等待,如果不進行優化,可能會讓執行緒佇列增大甚至阻塞,而且在等待時長超過設定的閾值時,執行緒將超時返回。
在此,初步對鎖進行優化,如何理解分布式鎖與單機鎖的應用範圍和實現機制,分布式鎖與單機鎖並不衝突,單機鎖類似於海選初賽,而分布式鎖則相當於決賽,單機鎖用於在當前伺服器中,控制所有執行緒的訪問,當最終有執行緒得到訪問資料庫或其他唯一性的可運算元據的中介軟體,再由分布式鎖來控制所有進入最終決賽執行緒的操作順序。
鎖分兩級,本地資料操作使用單機鎖,而對於資料庫的操作使用分布式鎖。
樂觀自旋鎖:在查詢資料庫時不進行加鎖,在修改資料庫時則對之前獲取的值和現有的值進行對比,如果資料不一致,則加鎖並對資料進行修改,當併發量不高時,這種方式可以減少加鎖次數,伺服器之間交替互相操作,恰好不產生衝突。
通過鎖空間實現細粒度加鎖:在分布式鎖定對資料庫的操作時,可以根據要修改的資料關鍵字段進行加鎖,如不同應用加不同的鎖,保證只是修改當前應用資料的這類執行緒加鎖,這樣可以提高併發量,減少不必要的鎖開銷。
總之,加鎖不是一勞永逸的操作,在保證資料一致性的同時,也要保證服務效能的開銷,通過不斷的測試和調整達到鎖應用的最優。
#工作
分布式 分布式鎖
本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...
鎖和分布式鎖
一 鎖和分布式鎖 1.1 鎖 我們一般所說的鎖,就是指單程序多執行緒的鎖機制。在單程序中,如果有多個執行緒併發訪問某個某個全域性資源,存在併發修改的問題。如果要避免這個問題,我們需要對資源進行同步,同步其實就是可以加乙個鎖來保證同一時刻只有乙個執行緒能操作這個資源。在不同的場景,可能使用的鎖得方式不...
分布式鎖 紅鎖
單台redis支援 set key value nx px time value 必須唯一避免誤解鎖,設定與失效時間不能分割,刪除鎖判斷是否解鎖人就是加鎖人,鎖失效時間應自動延長有效期 1 獲取當前時間 2 向多個節點獲取鎖,獲取鎖有乙個極小的超時時間。獲取鎖失敗後,立即嘗試下乙個redis節點獲取...