搜尋

首頁  >  問答  >  主體

Redis分散式鎖如何實現?

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

怪我咯怪我咯2796 天前784

全部回覆(3)我來回復

  • 迷茫

    迷茫2017-04-24 09:12:16

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

    回覆
    0
  • PHPz

    PHPz2017-04-24 09:12:16

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

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

    回覆
    0
  • 迷茫

    迷茫2017-04-24 09:12:16

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

    回覆
    0
  • 取消回覆