通過嘗試使用資料庫和redis來實現分布式鎖的方式
還有另外一種就是基於資料庫本身提供的排他鎖來實現分布式的鎖,利用資料庫的innodb引擎可以借助它自身的事務功能給我們開啟的鎖,當乙個執行緒進來時,通過select * from table where … for update可以讓innodb引擎在查詢的時候自發給這行記錄新增乙個排他鎖,因此當其他執行緒查詢當前記錄的時候,innodb的排他鎖將阻塞當前的查詢請求,在上乙個執行緒執行完任務的時候,innodb將釋放當前行的排他鎖,阻塞狀態中的下乙個請求將進來獲取新的排他鎖執行任務。這種鎖因為也是基於資料庫的鎖,因此也會出現單點故障的風險,因為一般來說只會部署乙個資料庫,還有這種鎖它也是一種不可重入的鎖,即在乙個執行緒獲取到鎖的時候另乙個執行緒無法獲取到該鎖。它是一種阻塞的鎖,當前執行緒需要鎖的時候不是告訴它獲取鎖失敗,取而代之的是阻塞當前的執行緒,讓鎖釋放後再分配給新的執行緒,這種鎖它並不是一種公平的鎖,因為鎖的獲取完全是隨機的。
public void getdisperselock() throws exception
else
}for (int i = 0; i <3 ; i++) catch (exception e)
}}).start();
}
使用redis實現分布式的鎖:
首先要知道redis的執行模式,redis是單程序單執行緒模式的快取資料庫,當併發訪問它時,它會把請求放在佇列中乙個乙個序列處理。
原理:使用redis的setnx key value命令,當要訪問的鍵不存在時,成功設定後返回1,當該鍵已經存在時,不做任何動作,返回0。當前客戶端在執行任務完畢後通過del key 命令刪除該鍵代表釋放該鎖。
使用zookeeper實現分布式鎖:基於zk實現分布式鎖依賴於zk的臨時有序節點的特性,基本的原理為:當乙個方法進來時,讓zk在它的znode目錄下生成乙個與方法名稱相同的目錄並建立乙個臨時的節點,根據當前臨時節點的序號,判斷當前的臨時節點是不是zk中最小的乙個,如果是,則讓其獲取鎖。
zookeeper分布式鎖
方案1 演算法思路 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起建立 test lock節點,只有乙個建立成功,成功者獲得鎖。解鎖時,只需刪除 test lock節點,其餘客戶端再次進入競爭建立節點,直到所有客戶端都獲得鎖。特點 這種方案的正確性和可靠性是zookeeper機制保證的,實現簡單。...
zookeeper分布式鎖
zookeeper節點有4個型別 1.持久型 2.瞬時型 3.持久自動排序型 4.瞬時自動排序型 分布式鎖利用的就是zookeeper中瞬時自動排序型節點特性。一 瞬時自動排序節點 瞬時特點為,當客戶端斷開連線的時候,該節點自動消除。自動排序則為,如果節點名字重複,則自動在該節點名字後新增數字,該數...
zookeeper 分布式鎖
分布式鎖肯定是用在分布式環境下。在分布式環境下,使用分布式鎖的目的也是保證同一時刻只有乙個執行緒來修改共享變數,修改共享快取 前景 jdk提供的鎖只能保證執行緒間的安全性,但分布式環境下,各節點之間的執行緒同步執行卻得不到保障,分布式鎖由此誕生。實現方式有以下幾種 基於資料庫實現分布式鎖 基於快取 ...