簡述分布式鎖的3種實現方式

2021-10-10 19:16:17 字數 2299 閱讀 4216

目錄

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瞬時有序節點實現的分布式鎖,其...