日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Redis分布式鎖應(yīng)用(實(shí)現(xiàn)+原理)
在分布式系統(tǒng)中,當(dāng)不同進(jìn)程或線程一起訪問共享資源時(shí),會(huì)造成資源爭(zhēng)搶,如果不加以控制的話,就會(huì)引發(fā)程序錯(cuò)亂。此時(shí)使用分布式鎖能夠非常有效的解決這個(gè)問題,它采用了一種互斥機(jī)制來防止線程或進(jìn)程間相互干擾,從而保證了數(shù)據(jù)的一致性。

提示:如果對(duì)分布式系統(tǒng)這一概念不清楚,可參考百度百科《分布式系統(tǒng)》,簡(jiǎn)而言之,它是一種架構(gòu)、一種模式。

Redis分布式鎖介紹

分布式鎖并非是 Redis 獨(dú)有,比如 MySQL 關(guān)系型數(shù)據(jù)庫(kù),以及 Zookeeper 分布式服務(wù)應(yīng)用,它們都實(shí)現(xiàn)分布式鎖,只不過 Redis 是基于緩存實(shí)現(xiàn)的。

Redis 分布式鎖有很對(duì)應(yīng)用場(chǎng)景,舉個(gè)簡(jiǎn)單的例子,比如春運(yùn)時(shí),您需要在 12306 上搶購(gòu)回家火車票,但 Redis 數(shù)據(jù)庫(kù)中只剩一張票了,此時(shí)有多個(gè)用戶來預(yù)訂購(gòu)買,那么這張票會(huì)被誰搶走呢?Redis 服務(wù)器又是如何處理這種情景的呢?在這個(gè)過程中就需要使用分布式鎖。

Redis 分布式鎖主要有以下特點(diǎn):

  • 第一:互斥性是分布式鎖的重要特點(diǎn),在任意時(shí)刻,只有一個(gè)線程能夠持有鎖;
  • 第二:鎖的超時(shí)時(shí)間,一個(gè)線程在持鎖期間掛掉了而沒主動(dòng)釋放鎖,此時(shí)通過超時(shí)時(shí)間來保證該線程在超時(shí)后可以釋放鎖,這樣其他線程才可以繼續(xù)獲取鎖;
  • 第三:加鎖和解鎖必須是由同一個(gè)線程來設(shè)置;
  • 第四:Redis 是緩存型數(shù)據(jù)庫(kù),擁有很高的性能,因此加鎖和釋放鎖開銷較小,并且能夠很輕易地實(shí)現(xiàn)分布式鎖。

注意:一個(gè)線程代表一個(gè)客戶端。

Redis分布式鎖命令

分布式鎖的本質(zhì)其實(shí)就是要在 Redis 里面占一個(gè)“坑”,當(dāng)別的進(jìn)程也要來占時(shí),發(fā)現(xiàn)已經(jīng)有人蹲了,就只好放棄或者稍做等待。這個(gè)“坑”同一時(shí)刻只允許被一個(gè)客戶端占據(jù),也就是本著“先來先占”的原則。

1) 常用命令

Redis 分布式鎖常用命令如下所示:

  • SETNX key val:僅當(dāng)key不存在時(shí),設(shè)置一個(gè) key 為 value 的字符串,返回1;若 key 存在,設(shè)置失敗,返回 0;
  • Expire key timeout:為 key 設(shè)置一個(gè)超時(shí)時(shí)間,以 second 秒為單位,超過這個(gè)時(shí)間鎖會(huì)自動(dòng)釋放,避免死鎖;
  • DEL key:刪除 key。

上述 SETNX 命令相當(dāng)于占“坑”操作,EXPIRE 是為避免出現(xiàn)意外用來設(shè)置鎖的過期時(shí)間,也就是說到了指定的過期時(shí)間,該客戶端必須讓出鎖,讓其他客戶端去持有。

但還有一種情況,如果在 SETNX 和 EXPIRE 之間服務(wù)器進(jìn)程突然掛掉,也就是還未設(shè)置過期時(shí)間,這樣就會(huì)導(dǎo)致 EXPIRE 執(zhí)行不了,因此還是會(huì)造成“死鎖”的問題。為了避免這個(gè)問題,Redis 作者在 2.6.12 版本后,對(duì) SET 命令參數(shù)做了擴(kuò)展,使它可以同時(shí)執(zhí)行 SETNX 和 EXPIRE 命令,從而解決了死鎖的問題。

直接使用 SET 命令實(shí)現(xiàn),語法格式如下:

SET key value [expiration EX seconds|PX milliseconds] [NX|XX]  
  • EX second:設(shè)置鍵的過期時(shí)間為 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
  • PX millisecond:設(shè)置鍵的過期時(shí)間為毫秒。SET key value PX millisecond 效果等同于 PSETEX key millisecondvalue 。
  • NX:只在鍵不存在時(shí),才對(duì)鍵進(jìn)行設(shè)置操作。 SET key value NX 效果等同于 SETNX key value 。
  • XX:只在鍵已經(jīng)存在時(shí),才對(duì)鍵進(jìn)行設(shè)置操作。

2) 命令應(yīng)用

下面進(jìn)行簡(jiǎn)單的命令演示:

127.0.0.1:6379> SETNX WEBNAME www.biancheng.net
(integer) 1
127.0.0.1:6379> EXPIRE WEBNAME 60
(integer) 1
127.0.0.1:6379> GET WEBNAME
"www.biancheng.net"
127.0.0.1:6379> TTL WEBNAME
(integer) 33
127.0.0.1:6379> SET name www.biancheng.net EX 60 NX
OK

網(wǎng)站標(biāo)題:Redis分布式鎖應(yīng)用(實(shí)現(xiàn)+原理)
網(wǎng)頁地址:http://www.dlmjj.cn/article/dhcddod.html