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

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

怪我咯
怪我咯

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

répondre à tous(3)
迷茫

Le redsi utilisé pour le comptage doit être un seul point. DECR dans redis est une opération atomique, vérifiez s'il est Pourquoi utiliser un verrou ? dehors;

PHPzhong

Voici les stratégies de verrouillage distribué Redis écrites par les internautes
Implémentation de verrous distribués basés sur Redis

Jedis n'implémente pas de verrous distribués. Le responsable a présenté Ression comme client Java recommandé plus tard. Si vous l'implémentez vous-même, vous risquez d'avoir de nombreux bugs pendant la phase de développement. implémentez des verrous distribués lorsque vous avez le temps. Le code source, ou voyez si vous pouvez prendre le code source et le modifier, et utiliser Jedis pour la connexion à la place.

迷茫

Utilisez simplement b(r|l)pop :
1, mettez un élément dans la liste à l'avance
2, plusieurs clients effectuent brpop et un seul client obtient l'élément (c'est-à-dire obtient le verrou )
3. Après le traitement, repoussez l'élément dans la liste et attendez que d'autres clients l'obtiennent
4. brpop peut définir un délai d'attente
Inconvénients :
1. élément à l'avance
2. Obtenez-le Si le client se ferme anormalement après le verrouillage, il y aura des problèmes

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal