分布式鎖實現(mysql redis zk)

2021-09-02 23:44:15 字數 1582 閱讀 7593

1,利用insert 和 delete控制資料記錄來實現鎖

2,利用mysql自帶鎖

private static final string lock_success = "ok";

private static final string set_if_not_exist = "nx";

private static final string set_with_expire_time = "ex";

private static final long release_success = 1l;

/*** 嘗試獲取分布式鎖

* @param jedis redis客戶端

* @param lockkey 鎖

* @param requestid 請求標識

* @param expiretime 超期時間

* @return 是否獲取成功

*/public static boolean trygetdistributedlock(jedis jedis, string lockkey, string requestid, int expiretime)

}finally

}return false;

}/**

* 釋放分布式鎖

* @param jedis redis客戶端

* @param lockkey 鎖

* @param requestid 請求標識

* @return 是否釋放成功

*/public static boolean releasedistributedlock(jedis jedis, string lockkey, string requestid)

}finally

}return false;

}/**

* 判斷鎖是否存在

* @param jedis redis客戶端

* @param lockkey 鎖

* @param requestid 請求標識

* @return 鎖是否存在

*/public static boolean checkdistributedlock(jedis jedis, string lockkey)

}finally

return false;

}

使用快取實現分布式鎖的優點

效能好。

使用快取實現分布式鎖的缺點

實現過於負責,需要考慮的因素太多。

建立臨時節點

可以解決單機,鎖無法釋放,非阻塞,不可衝入,非公平的問題

從理解的難易程度角度(從低到高)

資料庫 > 快取 > zookeeper

從實現的複雜性角度(從低到高)

zookeeper > 快取 > 資料庫

從效能角度(從高到低)

快取 > zookeeper >= 資料庫

從可靠性角度(從高到低)

zookeeper > 快取 > 資料庫

參考:

分布式鎖 使用Redis實現分布式鎖

關於分布式鎖的實現,我的前一篇文章講解了如何使用zookeeper實現分布式鎖。關於分布式鎖的背景此處不再做贅述,我們直接討論下如何使用redis實現分布式鎖。關於redis,筆主不打算做長篇大論的介紹,只介紹下redis優秀的特性。支援豐富的資料型別,如string list map set zs...

分布式鎖實現

1,資料庫實現原理 資料庫的行級x鎖。優點 不需要引入第三方應用。缺點 死鎖 對資料庫效能影響,可能較長時間占用資料庫連線資源 如果業務是分庫分表的,可能支援不了 示例 2,快取實現原理 通過setnx是否成功。當且僅當 key 不存在,將 key 的值設為 value 並返回1 若給定的 key ...

分布式 分布式鎖

本質是利用redis的setnx 方法的特性來加鎖,setnx 即key不存在則設定key,否則直接返回false,要求在分布式系統中使用同乙個redis服務,以下提供兩種解決方案 1 直接使用redistemplate 這其實並不能完全保證高併發下的安全問題,因為可能在鎖過期之後該執行緒尚未執行完...