Redis分布式锁如何实现?
怪我咯
怪我咯 2017-04-24 09:10:16
0
3
791

Redis 是一内存Key-Value数据库, 现在一般都用它来做缓存服务.目前在一次生产环境中使用了它做业务缓存, 主要用的使用场景是: 抽奖活动, 活动中对于不同的奖项有奖品数量限制, 这就相当于是一个抢购的功能一般, 由于后端的服务是分布式的, 这便衍生出一个问题, 这个奖品数量的控制如何实现? 参考了下一些网友的经验, 发现他们大部分都是使用 RedisSETNX命令+sleep 实现类似锁的概念. 但sleep的方法似乎会造成一些不必要的资源消耗, 官方推荐的是使用Redisson(Java语言), 它已经实现了RLock, 不过我们已经使用了Jedis实现对Redis操作. 不知道大家对此场景有更加好的建议? 如果有使用过RedissonJedis经验最好, 可以一起分析讨论下两者的差异与优缺点.谢谢.

怪我咯
怪我咯

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

全員に返信(3)
迷茫

redis の DECR は単一のポイントである必要があります。実行後、マージンがあるかどうかを確認するために、ロックを使用する必要があります。

いいねを押す +0
PHPzhong

ここにネチズンによって書かれた Redis 分散ロック戦略があります
Redis に基づいた分散ロックの実装

Jedis は分散ロックを実装していません。後ほど公式が推奨 Java クライアントとして Ression を紹介しました。開発段階では多くのバグが発生する可能性があるため、時間があれば参照してください。 Ression のソース コードを参照して分散ロックを実装するか、ソース コードを取得して変更し、代わりに接続に Jedis を使用できるかどうかを確認してください。

いいねを押す +0
迷茫

b(r|l)pop を使用するだけです。
1. 要素をリストに事前に配置します
2. 1 つのクライアントのみが要素を取得します (つまり、ロックを取得します)
3.要素をリストに戻し、他のクライアントがそれを取得するのを待ちます
4. brpop はタイムアウトを設定できます
欠点:
1. ロックを取得した後にクライアントが異常終了した場合、問題が起きるでしょう

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート