redis作爲分佈式鎖的要點

 if (redisClient.setnx(lockKey, "1") > 0) {//鎖不存在,則獲取鎖成功  
               redisClient.expire(lockKey, lockSeconds);  
 } 

你這個setnx和expire一定要是原子性的,即要不兩個都成功,要不兩個都失敗。
不然你前面成功了,後面設置時間這個失敗了,鎖就沒有有效時間了,他一直存在着。
爲了避免這種問題出現我們需要這個方法判斷一下

if (redisClient.ttl(lockKey) == -1) {//防止上一操作加鎖成功,但設置過期語句執行失敗; [當 key 存在但沒有設置剩餘生存時間時,返回 -1]  
                   redisClient.expire(lockKey, 1);//迅速過期,1秒有效時間
}  

redisClient.del(lockKey)//刪除鍵

Redis TTL 命令以秒爲單位返回 key 的剩餘過期時間。

當 key 不存在時,返回 -2 。 當 key 存在但沒有設置剩餘生存時間時,返回 -1 。 

否則,以秒爲單位,返回 key 的剩餘生存時間。

注意:在 Redis 2.8 以前,當 key 不存在,或者 key 沒有設置剩餘生存時間時,命令都返回 -1 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章