目錄
1、分布式鎖
2、實現方式
2.1 資料庫實現
2.2 redis實現
2.3 zookeeper實現
作為分布式鎖,我覺得至少得:1. 資源唯一且能非同步多執行緒訪問; 2. 能改變狀態(加鎖 / 開鎖);
【資料庫】你可以設定字段唯一,可以建立 state 字段;
【redis】 的key唯一,能設定value狀態;
【zookeeper】檔名唯一,狀態通過建立檔案,刪除檔案來表示狀態;
分布式鎖存在的問題:
1. 因為是分布式大系統,若分布式鎖掛了影響甚大;
2. 是鎖就得考慮死鎖;redis設定過期時間,資料庫感覺可以考慮定時開鎖,zookeeper貌似也可以設定定時任務開鎖;
drop table if exists `method_lock`;
create table `method_lock` (
`id` int(11) unsigned not null auto_increment comment '主鍵',
`method_name` varchar(64) not null comment '鎖定的方法名',
`state` tinyint not null comment '1:未分配;2:已分配',
`update_time` timestamp not null default current_timestamp on update current_timestamp,
`version` int not null comment '版本號',
`primary key (`id`),
unique key `uidx_method_name` (`method_name`) using btree
) engine=innodb auto_increment=3 default charset=utf8 comment='鎖定中的方法';
先獲取鎖的資訊
select id, method_name, state,version from method_lock where state=1 and method_name='methodname';
占有鎖update t_resoure set state=2, version=2, update_time=now() where method_name='methodname' and state=1 and version=2;
如果沒有更新影響到一行資料,則說明這個資源已經被別人佔位了。
setnx key val;設定鎖
expire key timeout
;設定鎖過期時間;
delete key
;刪除釋放鎖;
為啥用zookeeper ? zookeeper有啥這方面的特點?那麼上圖的過程就是:zookeeper
內部是乙個
分層的檔案系統目錄樹結構
,並且規定同乙個目錄下只能有乙個唯一檔名,同名檔案多次建立會在檔名稱後補數字區分;
故而,若建立了lock檔案,再次建立生成 lock1 檔案,再次建立生成 lock2 檔案,再再次建立生成 lock3 檔案;
建立乙個資料夾叫「資源」,然後 client1 需要占用資源,就建立乙個 lock1 檔案,發現沒有比自己的 lock1 檔案數字更小的,那麼 client1 就獲取資源使用權;
然後 client2 也需要占用資源,那麼也建立乙個lock檔案(最終生成的檔案叫 lock2 ),發現自己前面還有個比自己檔案數字更小的 lock1 ,自己檔案數字不是最小的,那麼就監聽 lock1, 等待其釋放資源;
client 3也來了,也需要占用資源,那麼也建立乙個lock檔案(最終生成的檔案叫 lock3 ),發現有個 lock2 , 同理,其監聽等待 lock2 ;
設定鎖----》生成鎖檔案
釋放鎖----》刪除鎖檔案
注意:zookeeper 第三方庫curator
客戶端,這個客戶端中封裝了乙個可重入的鎖服務,它提供的interprocessmutex是分布式鎖的實現。acquire方法使用者獲取鎖,release方法用於釋放鎖;
分布式鎖的實現 3種常見方式
分布式鎖的實現核心思路 找乙個公共區來生產和存放鎖。because 既然是分布式,在單機上建立的例項物件 包括鎖物件 也只能作用於本機上,無法保證分布式中多台伺服器的一致性,所以此時的鎖一定要放在乙個公共的區域去建立,各個分布式服務都去訪問這個公共區域。最常見的公共區域有 資料庫,redis和zoo...
分布式鎖實現方式
1 資料庫的唯一索引實現 獲得鎖時向表中插入一條記錄,釋放鎖時刪除這條記錄。唯一索引可以保證該記錄只被插入一次,那麼就可以用這個記錄是否存在來判斷是否存於鎖定狀態。缺點 2 redis的setnx指令實現 使用 setnx set if not exist 指令插入乙個鍵值對,如果 key 已經存在...
分布式鎖的實現方式
在進行大型 技術架構設計以及業務實現的過程中,多少都會遇到需要使用分布式鎖的情況。那麼問題也就接踵而至。分布式鎖zk和memcached以及redis三者都能實現,同樣是分布式鎖,三者的區別何在?各自適用什麼場景?一 zookeeper 實現原理 基於zookeeper瞬時有序節點實現的分布式鎖,其...