Redis
是一內存Key-Value
資料庫, 現在一般都用它來做緩存服務.目前在一次生產環境中使用了它做業務緩存, 主要用的使用場景是: 抽獎活動, 活動中對於不同的獎項有獎品數量限制, 這就相當於是一個搶購的功能一般, 由於後端的服務是分佈式的, 這便衍生出一個問題, 這個獎品數量的控制如何實現?參考了下一些網友的經驗, 發現他們大部分都是使用Redis
的SETNX
命令+sleep
實現類似鎖的概念. 但< code>sleep的方法似乎會造成一些不必要的資源消耗, 官方推薦的是使用Redisson
(Java
語言), 它已經實現了RLock
,不過我們已經使用了Jedis
實現對Redis
操作. 不知道大家對此場景有更加好的建議? 如果有使用過Redisson
和Jedis
經驗最好, 可以一起分析討論下兩者的差異與優缺點.謝謝.
PHPz2017-04-24 09:12:16
這裡有網友寫的Redis分散式鎖定的策略
基於Redis實現分散式鎖定
Jedis是沒有實現分散式鎖的,官方後來才引入Ression作為推薦的Java客戶端,自己實現的話可能會有許多bug,在開發的階段不建議,有空可以看看Ression實現分散式鎖的源碼,或是看看能不能把源碼拿過來改改,改用Jedis做連接。
迷茫2017-04-24 09:12:16
使用b(r|l)pop就可以:
1,預先放入一個元素到list
2,多個客戶端進行brpop,只有一個客戶端獲取到元素(即獲取lock)
3,處理完之後將元素blpush回list,待其他客戶端取得
4,brpop可以設定超時
缺點:
1,需要預先放入一個元素
2,取得lock後的客戶端異常退出,則會有問題