新聞中心

提示:如果對(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


咨詢
建站咨詢
