分布式鎖redis和zookeeper

2021-08-15 08:51:55 字數 1009 閱讀 4829

首先說到分布式鎖再談一下資料庫樂觀鎖和悲觀鎖

樂觀鎖:使用資料版本(version)記錄機制實現,這是樂觀鎖最常用的一種實現方式。何謂資料版本?即為資料增加乙個版本標識,一般是通過為資料庫表增加乙個數字型別的 「version」 欄位來實現。當讀取資料時,將version欄位的值一同讀出,資料每更新一次,對此version值加一。當我們提交更新的時候,判斷資料庫表對應記錄的當前版本資訊與第一次取出來的version值進行比對,如果資料庫表當前版本號與第一次取出來的version值相等,則予以更新,否則認為是過期資料

資料庫具體實現方式:

有三個字段,分別是id,value、version

1.先讀task表的資料(實際上這個表只有一條記錄),得到version的值為versionvalue

2.每次更新task表中的value欄位時,為了防止發生衝突,需要這樣操作

update task set value = newvalue,version =  versionvalue + 1   where version = versionvalue;

執行後返回1,才表明本次更新value欄位的值成功 

悲觀鎖:悲觀鎖的實現,往往依靠資料庫提供的鎖機制,在整個資料處理過程中,將資料處於鎖定狀態。

資料庫具體實現方式:

資料庫表t_goods,包括id,status,name三個字段,id為主鍵,資料庫中記錄如下;

select * from t_goods where id=1 for update;  ---select  **** for update代表鎖住該資料

當第一次查詢後如果再執行以下sql

select * from t_goods where id=1 for update;  ---該sql查詢會被阻塞,只能等待第乙個sql提交事務後才可以執行

select * from t_goods where id=3  ---該sql查詢不會因為第一條資料阻塞影響查詢

分布式鎖概念及使用:

redis分布式鎖

redis分布式鎖 直接上 我寫了四個redis分布式鎖的方法,大家可以提個意見 第一種方法 redis分布式鎖 param timeout public void lock long timeout thread.sleep 100 catch exception e override publi...

Redis分布式鎖

分布式鎖一般有三種實現方式 1.資料庫樂觀鎖 2.基於redis的分布式鎖 3.基於zookeeper的分布式鎖.首先,為了確保分布式鎖可用,我們至少要確保鎖的實現同時滿足以下四個條件 互斥性。在任意時刻,只有乙個客戶端能持有鎖。不會發生死鎖。即使有乙個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保...

redis分布式鎖

使用redis的setnx命令實現分布式鎖 redis為單程序單執行緒模式,採用佇列模式將併發訪問變成序列訪問,且多個客戶端對redis的連線並不存在競爭關係。redis的setnx命令可以方便的實現分布式鎖。setnx key value 將key的值設為value,當且僅當key不存在。如給定的...