redis分布式锁实现代码怎么写


这篇文章主要讲解了“redis分布式锁实现代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“redis分布式锁实现代码怎么写”吧!随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Java API并不能提供分布式锁的能力。为了解决这个问题就需要一种跨JVM的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!分布式锁主流的实现方案:1. 基于数据库实现分布式锁2. 基于缓存(Redis等)3. 基于Zookeeper每一种分布式锁解决方案都有各自的优缺点:1. 性能:redis最高2. 可靠性:zookeeper最高这里,我们就基于redis实现分布式锁。使用redis实现分布式锁redis:命令# set sku:1:info “OK” NX PX 10000EX second :设置键的过期时间为 second 秒。 SET key value EX second 效果等同于 SETEX 免费云主机域名key second value 。PX millisecond :设置键的过期时间为 millisecond 毫秒。 SET key value PX millisecond 效果等同于 PSETEX key millisecond value 。NX :只在键不存在时,才对键进行设置操作。 SET key value NX 效果等同于 SETNX key value 。XX :只在键已经存在时,才对键进行设置操作。1. 多个客户端同时获取锁(setnx)2. 获取成功,执行业务逻辑{从db获取数据,放入缓存},执行完成释放锁(del)3. 其他客户端等待重试Redis:set num 0重启,服务集群,通过网关压力测试:ab -n 1000 -c 100 http://192.168.140.1:8080/test/testLock查看redis中num的值:基本实现。问题:setnx刚好获取到锁,业务逻辑出现异常,导致锁无法释放解决:设置过期时间,自动释放锁。优化之设置锁的过期时间设置过期时间有两种方式:1. 首先想到通过expire设置过期时间(缺乏原子性:如果在setnx和expire之间出现异常,锁也无法释放)2. 在set时指定过期时间(推荐)设置过期时间:压力测试肯定也没有问题。自行测试问题:可能会释放其他服务器的锁。场景:如果业务逻辑的执行时间是7s。执行流程如下index1业务逻辑没执行完,3秒后锁被自动释放。index2获取到锁,执行业务逻辑,3秒后锁被自动释放。index3获取到锁,执行业务逻辑index1业务逻辑执行完成,开始调用del释放锁,这时释放的是index3的锁,导致index3的业务只执行1s就被别人释放。最终等于没锁的情况。解决:setnx获取锁时,设置一个指定的唯一值(例如:uuid);释放前获取这个值,判断是否自己的锁感谢各位的阅读,以上就是“redis分布式锁实现代码怎么写”的内容了,经过本文的学习后,相信大家对redis分布式锁实现代码怎么写这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: vue中axios和ajax怎么使用

这免费云主机域名篇文章主要讲解了“vue中axios和ajax怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue中axios和ajax怎么使用”吧!vue中axios和ajax区别是:1.axios是…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/31 21:01
下一篇 03/31 21:01

相关推荐