Redis分布式锁如何实现?

 拍友2502881913 发布于 2022-10-26 09:54

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

3 个回答
  • 使用b(r|l)pop就可以:
    1,预先放入一个元素到list
    2,多个客户端进行brpop,只有一个客户端获取到元素(即获取lock)
    3,处理完之后将元素blpush回list,待其他客户端获取
    4,brpop可以设置超时
    缺点:
    1,需要预先放入一个元素
    2,获取lock后的客户端异常退出,则会有问题

    2022-10-27 00:35 回答
  • 这里有网友写的Redis分布式锁的策略
    基于Redis实现分布式锁

    Jedis是没有实现分布式锁的,官方后来才引入Ression作为推荐的Java客户端,自己实现的话可能会有许多bug,在开发的阶段不建议,有空可以看看Ression实现分布式锁的源码,或者看看能不能把源码拿过来改改,改用Jedis做连接。

    2022-10-27 00:35 回答
  • 用于计数的redsi应该是单点吧,redis中的DECR是原子性的操作,通过执行后,查看是否<0来判断是否还有余量;
    为什么要用锁呢,请指出;

    2022-10-27 00:36 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有