recherche

Maison  >  Questions et réponses  >  le corps du texte

Redis分布式锁如何实现?

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

怪我咯怪我咯2796 Il y a quelques jours785

répondre à tous(3)je répondrai

  • 迷茫

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

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

    répondre
    0
  • PHPz

    PHPz2017-04-24 09:12:16

    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.

    répondre
    0
  • 迷茫

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

    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

    répondre
    0
  • Annulerrépondre