Redis分散式鎖如何實現?
怪我咯
怪我咯 2017-04-24 09:10:16
0
3
817

Redis 是一內存Key-Value資料庫, 現在一般都用它來做緩存服務.目前在一次生產環境中使用了它做業務緩存, 主要用的使用場景是: 抽獎活動, 活動中對於不同的獎項有獎品數量限制, 這就相當於是一個搶購的功能一般, 由於後端的服務是分佈式的, 這便衍生出一個問題, 這個獎品數量的控制如何實現?參考了下一些網友的經驗, 發現他們大部分都是使用RedisSETNX命令+sleep 實現類似鎖的概念. 但< code>sleep的方法似乎會造成一些不必要的資源消耗, 官方推薦的是使用Redisson(Java語言), 它已經實現了RLock,不過我們已經使用了Jedis實現對Redis操作. 不知道大家對此場景有更加好的建議? 如果有使用過RedissonJedis經驗最好, 可以一起分析討論下兩者的差異與優缺點.謝謝.

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回覆(3)
迷茫

用於計數的redsi應該是單點吧,redis中的DECR是原子性的操作,通過執行後,查看是否為什麼要用鎖呢,請指出;

PHPzhong

這裡有網友寫的Redis分散式鎖定的策略
基於Redis實現分散式鎖定

Jedis是沒有實現分散式鎖的,官方後來才引入Ression作為推薦的Java客戶端,自己實現的話可能會有許多bug,在開發的階段不建議,有空可以看看Ression實現分散式鎖的源碼,或是看看能不能把源碼拿過來改改,改用Jedis做連接。

迷茫

使用b(r|l)pop就可以:
1,預先放入一個元素到list
2,多個客戶端進行brpop,只有一個客戶端獲取到元素(即獲取lock)
3,處理完之後將元素blpush回list,待其他客戶端取得
4,brpop可以設定超時
缺點:
1,需要預先放入一個元素
2,取得lock後的客戶端異常退出,則會有問題

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板