概述
那麼這個時候,如果你需要加個鎖,讓多個分布式的機器在訪問共享資源的時候序列起來
那麼這個時候,那個鎖,多個不同機器上的服務共享的鎖,就是分布式鎖
分布式鎖當然有很多種不同的實現方案,redis分布式鎖,zookeeper分布式鎖對比
資料庫鎖:
優點:直接使用資料庫,使用簡單。
缺點:分布式系統大多數瓶頸都在資料庫,使用資料庫鎖會增加資料庫負擔。
快取鎖:
優點:效能高,實現起來較為方便,在允許偶發的鎖失效情況,不影響系統正常使用,建議採用快取鎖。
缺點:通過鎖超時機制不是十分可靠,當執行緒獲得鎖後,處理時間過長導致鎖超時,就失效了鎖的作用。
zookeeper鎖:
優點:不依靠超時時間釋放鎖;可靠性高;系統要求高可靠性時,建議採用zookeeper鎖。
缺點:效能比不上快取鎖,因為要頻繁的建立節點刪除節點。
zk實現
/**
* zksession
* * @author kris
* */
public class zksession catch (exception e)
} /**
* 獲取分布式鎖
* * @param path
* /curator/lock
*/public void acquirelock(string path) else
} catch (exception e2)
break;
}} catch (exception e) }
/*** 釋放鎖
*/public void releaselock()
if (null != client)
} catch (exception e)
}
3.1 使用
//建立臨時節點路徑
string path = "/curator/lock";
zksession lock = new zksession().acquirelock(lock);
//...執行業務需求
thread.sleep(3000);
lock.releaselock();
redis實現
我這裡是用codis的jodis實現的
public class jodisutils
} catch (exception e)
} private static jodisutils ins;
public static jodisutils getinstance()
return ins;
} /**
* 原子獲取鎖
* @param key
* @param value
* @param expiremillis
* @return
*/public boolean acquirelock(string key,string value,int seconds) else
/*boolean releaselock = jodisutils.getinstance().releaselock(key, uuid);
if (releaselock) */
} catch (exception e2)
} } catch (exception e)
} /**
* 執行lua指令碼釋放鎖(刪除)
* @param key
* @param value
* @return
*/public boolean releaselock(string key, string value)
return flag;
} catch (exception e) finally
} catch (exception e)
}}
4.1 使用
public static void main(string args)
}}).start();
}}
Redis和ZK實現分布式鎖
1 使用redis分布式鎖的原因 redis效能好 命令支援比較好,實現方便。2 實現方式 直接用int setnx寫key,如果成功了,說明獲取鎖成功,否則拿鎖失敗。拿鎖成功之後對key設定超時時間,操作完成時可通過del key釋放鎖。1 通過建立zk的znode節點進行控制。檢查zookeep...
zk實現分布式鎖
前言 2016春節之後一直比較忙,因此部落格n個沒有更新,現在也是忙裡偷閒,偷偷的更新一篇!一 分布式鎖介紹 分布式鎖主要用於在分布式環境中保護跨程序 跨主機 跨網路的共享資源實現互斥訪問,以達到保證資料的一致性。二 架構介紹 在介紹使用zookeeper實現分布式鎖之前,首先看當前的系統架構圖 解...
ZK分布式鎖
分布式鎖是控制分布式系統之間同步訪問共享資源的一種方式。如果不同的系統或者是同乙個系統的不同主機之間共享了乙個或者一組資源,那麼訪問這些資源的時候,往往需要一些互斥手段來防止彼此之間的干擾,以保證一致性,在這種情況下,就需要分布式鎖了 zookeeper中有一種節點叫做順序節點,假如我們在 lock...