官术网_书友最值得收藏!

Redis應用實例

3.2 解決方案

每個鎖程序至少需要實現以下兩個方?法。

加鎖——嘗試獲得鎖的獨占權,在任何時候只能有最多一個客戶端成功加鎖,而除此以外的其他客戶端則會失?敗。

解鎖——成功加鎖的客戶端可以通過解鎖釋放對鎖的獨占權,使包括它自身在內的所有客戶端都能夠重新獲得加鎖的機?會。

在Redis中實現上述兩個操作最基本的方法就是使用字符串數據結構,其中加鎖操作可以通過SET命令及其NX選項來實現:

SET key value NX

NX選項的效果保證了給定鍵只會在沒有值(也就是鍵不存在)的情況下被設置。通過將一個鍵指定為鎖鍵,并使用客戶端嘗試對它執行帶NX選項的SET命令,就可以根據命令返回的結果判斷加鎖是否成功:

如果命令成功設置了指定的鎖鍵,那么代表當前客戶端成功加鎖;

如果命令未能成功設置鎖鍵,那么說明鎖已被其他客戶端占?用。

因為帶NX選項的SET命令是原子命令,所以即使有多個客戶端同時對同一個鎖鍵執行相同的設置命令,也只會有一個客戶端能夠成功執行設置操作,因此上述的加鎖操作實現是安全?的。

另外,當客戶端需要解鎖的時候,只需要使用DEL命令將鎖鍵刪除即可:

DEL key

在鎖鍵被刪除之后,它所代表的鎖也會重新回到解鎖狀?態。

主站蜘蛛池模板: 乌拉特前旗| 太和县| 双柏县| 长丰县| 五常市| 宜兴市| 元阳县| 太谷县| 蓝山县| 平谷区| 类乌齐县| 锡林浩特市| 腾冲县| 宜都市| 邓州市| 固镇县| 安泽县| 新竹县| 礼泉县| 茶陵县| 崇义县| 诸暨市| 廊坊市| 石泉县| 易门县| 都江堰市| 大关县| 夏津县| 阳曲县| 武冈市| 鸡泽县| 福鼎市| 轮台县| 舒兰市| 化州市| 乐山市| 宁蒗| 中宁县| 体育| 阿瓦提县| 南阳市|