這篇文章主要講解了“redis分布式鎖的實現(xiàn)原理是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“redis分布式鎖的實現(xiàn)原理是什么”吧!
成都創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、東河網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、商城網(wǎng)站建設(shè)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為東河等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同時有多個客戶端發(fā)送setnx命令,只有一個客戶端可以成功,返回1(true);其他的客戶端返回0(false)。
本教程操作環(huán)境:windows7系統(tǒng)、Redis5.0.10版、DELL G3電腦。
分布式鎖的實現(xiàn)
隨著業(yè)務(wù)發(fā)展的需要,原單體單機部署的系統(tǒng)被演化成分布式集群系統(tǒng)后,由于分布式系統(tǒng)多線程、多進程并且分布在不同機器上,這將使原單機部署情況下的并發(fā)控制鎖策略失效,單純的Java API并不能提供分布式鎖的能力。為了解決這個問題就需要一種跨JVM的互斥機制來控制共享資源的訪問,這就是分布式鎖要解決的問題!
分布式鎖主流的實現(xiàn)方案:
基于數(shù)據(jù)庫實現(xiàn)分布式鎖
基于緩存(Redis等)
基于Zookeeper
這里,我們就基于redis實現(xiàn)分布式鎖。
基本實現(xiàn)
借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同時有多個客戶端發(fā)送setnx命令,只有一個客戶端可以成功,返回1(true);其他的客戶端返回0(false)。

主要使用Redis Setnx 命令
在指定的 key 不存在時,為 key 設(shè)置指定的值
設(shè)置成功,返回 1 。 設(shè)置失敗,返回 0
redis> EXISTS job # job 不存在 (integer) 0 redis> SETNX job "programmer" # job 設(shè)置成功 (integer) 1 redis> SETNX job "code-farmer" # 嘗試覆蓋 job ,失敗 (integer) 0 redis> GET job # 沒有被覆蓋 "programmer"
java代碼
public void testLock() {
// 執(zhí)行redis的setnx命令
String uuid = UUID.randomUUID().toString();
Boolean lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 5, TimeUnit.SECONDS);
// 判斷是否拿到鎖
if (lock) {
// 執(zhí)行業(yè)務(wù)邏輯代碼
// ...
// 釋放鎖資源 (保證獲取值和刪除操作的原子性) LUA腳本保證刪除的原子性
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1]) else return 0 end";
this.redisTemplate.execute(new DefaultRedisScript<>(script),
Arrays.asList("lock"), Arrays.asList(uuid));
// if (StrUtil.equals(uuid,redisTemplate.opsForValue().get("lock"))){
// redisTemplate.delete("lock");
// }
} else {
// 其他請求嘗試獲取鎖
testLock();
}
}為了確保分布式鎖可用,我們至少要確保鎖的實現(xiàn)同時滿足以下四個條件:
互斥性。在任意時刻,只有一個客戶端能持有鎖。
不會發(fā)生死鎖。即使有一個客戶端在持有鎖的期間崩潰而沒有主動解鎖,也能保證后續(xù)其他客戶端能加鎖。
解鈴還須系鈴人。加鎖和解鎖必須是同一個客戶端,客戶端自己不能把別人加的鎖給解了。
感謝各位的閱讀,以上就是“redis分布式鎖的實現(xiàn)原理是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對redis分布式鎖的實現(xiàn)原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
分享文章:redis分布式鎖的實現(xiàn)原理是什么
標題鏈接:http://chinadenli.net/article32/gdjhsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、營銷型網(wǎng)站建設(shè)、云服務(wù)器、建站公司、網(wǎng)站改版、網(wǎng)站排名
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)