新聞中心

提示:如果對分布式系統(tǒng)這一概念不清楚,可參考百度百科《分布式系統(tǒng)》,簡而言之,它是一種架構(gòu)、一種模式。
Redis分布式鎖介紹
分布式鎖并非是 Redis 獨有,比如 MySQL 關(guān)系型數(shù)據(jù)庫,以及 Zookeeper 分布式服務(wù)應(yīng)用,它們都實現(xiàn)分布式鎖,只不過 Redis 是基于緩存實現(xiàn)的。
Redis 分布式鎖有很對應(yīng)用場景,舉個簡單的例子,比如春運時,您需要在 12306 上搶購回家火車票,但 Redis 數(shù)據(jù)庫中只剩一張票了,此時有多個用戶來預(yù)訂購買,那么這張票會被誰搶走呢?Redis 服務(wù)器又是如何處理這種情景的呢?在這個過程中就需要使用分布式鎖。
Redis 分布式鎖主要有以下特點:
- 第一:互斥性是分布式鎖的重要特點,在任意時刻,只有一個線程能夠持有鎖;
- 第二:鎖的超時時間,一個線程在持鎖期間掛掉了而沒主動釋放鎖,此時通過超時時間來保證該線程在超時后可以釋放鎖,這樣其他線程才可以繼續(xù)獲取鎖;
- 第三:加鎖和解鎖必須是由同一個線程來設(shè)置;
- 第四:Redis 是緩存型數(shù)據(jù)庫,擁有很高的性能,因此加鎖和釋放鎖開銷較小,并且能夠很輕易地實現(xiàn)分布式鎖。
注意:一個線程代表一個客戶端。
Redis分布式鎖命令
分布式鎖的本質(zhì)其實就是要在 Redis 里面占一個“坑”,當(dāng)別的進程也要來占時,發(fā)現(xiàn)已經(jīng)有人蹲了,就只好放棄或者稍做等待。這個“坑”同一時刻只允許被一個客戶端占據(jù),也就是本著“先來先占”的原則。
1) 常用命令
Redis 分布式鎖常用命令如下所示:
- SETNX key val:僅當(dāng)key不存在時,設(shè)置一個 key 為 value 的字符串,返回1;若 key 存在,設(shè)置失敗,返回 0;
- Expire key timeout:為 key 設(shè)置一個超時時間,以 second 秒為單位,超過這個時間鎖會自動釋放,避免死鎖;
- DEL key:刪除 key。
上述 SETNX 命令相當(dāng)于占“坑”操作,EXPIRE 是為避免出現(xiàn)意外用來設(shè)置鎖的過期時間,也就是說到了指定的過期時間,該客戶端必須讓出鎖,讓其他客戶端去持有。
但還有一種情況,如果在 SETNX 和 EXPIRE 之間服務(wù)器進程突然掛掉,也就是還未設(shè)置過期時間,這樣就會導(dǎo)致 EXPIRE 執(zhí)行不了,因此還是會造成“死鎖”的問題。為了避免這個問題,Redis 作者在 2.6.12 版本后,對 SET 命令參數(shù)做了擴展,使它可以同時執(zhí)行 SETNX 和 EXPIRE 命令,從而解決了死鎖的問題。
直接使用 SET 命令實現(xiàn),語法格式如下:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
- EX second:設(shè)置鍵的過期時間為 second 秒。 SET key value EX second 效果等同于 SETEX key second value 。
- PX millisecond:設(shè)置鍵的過期時間為毫秒。SET key value PX millisecond 效果等同于 PSETEX key millisecondvalue 。
- NX:只在鍵不存在時,才對鍵進行設(shè)置操作。 SET key value NX 效果等同于 SETNX key value 。
- XX:只在鍵已經(jīng)存在時,才對鍵進行設(shè)置操作。
2) 命令應(yīng)用
下面進行簡單的命令演示:
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
當(dāng)前文章:Redis分布式鎖應(yīng)用(實現(xiàn)+原理)
URL標(biāo)題:http://www.5511xx.com/article/dhcddod.html


咨詢
建站咨詢
