成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

redis分布式鎖的實(shí)現(xiàn)原理是什么

這篇文章主要講解了“redis分布式鎖的實(shí)現(xiàn)原理是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“redis分布式鎖的實(shí)現(xiàn)原理是什么”吧!

成都創(chuàng)新互聯(lián)專注于企業(yè)營銷型網(wǎng)站建設(shè)、網(wǎng)站重做改版、東河網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為東河等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同時(shí)有多個(gè)客戶端發(fā)送setnx命令,只有一個(gè)客戶端可以成功,返回1(true);其他的客戶端返回0(false)。

本教程操作環(huán)境:windows7系統(tǒng)、Redis5.0.10版、DELL G3電腦。

分布式鎖的實(shí)現(xiàn)

隨著業(yè)務(wù)發(fā)展的需要,原單體單機(jī)部署的系統(tǒng)被演化成分布式集群系統(tǒng)后,由于分布式系統(tǒng)多線程、多進(jìn)程并且分布在不同機(jī)器上,這將使原單機(jī)部署情況下的并發(fā)控制鎖策略失效,單純的Java API并不能提供分布式鎖的能力。為了解決這個(gè)問題就需要一種跨JVM的互斥機(jī)制來控制共享資源的訪問,這就是分布式鎖要解決的問題!

分布式鎖主流的實(shí)現(xiàn)方案:

  • 基于數(shù)據(jù)庫實(shí)現(xiàn)分布式鎖

  • 基于緩存(Redis等)

  • 基于Zookeeper

這里,我們就基于redis實(shí)現(xiàn)分布式鎖。

基本實(shí)現(xiàn)

借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同時(shí)有多個(gè)客戶端發(fā)送setnx命令,只有一個(gè)客戶端可以成功,返回1(true);其他的客戶端返回0(false)。

redis分布式鎖的實(shí)現(xiàn)原理是什么

主要使用Redis Setnx 命令

在指定的 key 不存在時(shí),為 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();

		}

	}

為了確保分布式鎖可用,我們至少要確保鎖的實(shí)現(xiàn)同時(shí)滿足以下四個(gè)條件:

互斥性。在任意時(shí)刻,只有一個(gè)客戶端能持有鎖。

不會(huì)發(fā)生死鎖。即使有一個(gè)客戶端在持有鎖的期間崩潰而沒有主動(dòng)解鎖,也能保證后續(xù)其他客戶端能加鎖。

解鈴還須系鈴人。加鎖和解鎖必須是同一個(gè)客戶端,客戶端自己不能把別人加的鎖給解了。

感謝各位的閱讀,以上就是“redis分布式鎖的實(shí)現(xiàn)原理是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對redis分布式鎖的實(shí)現(xiàn)原理是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享文章:redis分布式鎖的實(shí)現(xiàn)原理是什么
標(biāo)題鏈接:http://jinyejixie.com/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)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
高碑店市| 九龙城区| 若羌县| 罗甸县| 和平县| 喀什市| 黎平县| 台州市| 湟源县| 渝中区| 关岭| 济源市| 汝城县| 庆阳市| 天台县| 凌云县| 丰镇市| 朝阳市| 滁州市| 遂溪县| 贞丰县| 武功县| 吴旗县| 南江县| 井冈山市| 隆回县| 辽宁省| 三河市| 达孜县| 华坪县| 眉山市| 潢川县| 山东| 昂仁县| 谷城县| 宜兴市| 宁南县| 台北县| 辽阳市| 巴南区| 南川市|