摘要:基本原理就是使用的命令来实现。将的值设为,当且仅当不存在。设置失败时,说明这个锁正在使用中。在一定时间内,循环请求,直到当前锁释放,然后获得锁实例前文中连接的方法获取锁失败此处进行操作,操作完成后释放锁防止死锁,超过分钟删除参考资料。
导语
需求就不细说了,想必都遇到过要用数据锁的场景。看了一些资料以及其他的代码,修改记录下。
SETNX基本原理就是使用 Redis 的 SETNX 命令来实现。
将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
返回值:
设置成功,返回 1 。
设置失败,返回 0 。
设置失败时,说明这个锁正在使用中。在一定时间内,循环请求,直到当前锁释放,然后获得锁
实例setnx($redisKey, $redisValue); if (!$flag) { // 获取锁失败 usleep(200000); continue; } // 此处进行操作,操作完成后释放锁 $redis->del($redisKey); return true; } // 防止死锁,超过 5 分钟删除 if (time() - $redis->get($redisKey) > (60 * 5)) { $redis->del($redisKey); } return false; }
参考资料:SETNX。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/30076.html
摘要:集群实现分布式锁上面的讨论中我们有一个非常重要的假设是单点的。但是其实这已经超出了实现分布式锁的范围,单纯用没有命令来实现生成。这个问题用实现分布式锁暂时无解。结论并不能实现严格意义上的分布式锁。 关于Redis实现分布式锁的问题,网络上很多,但是很多人的讨论基本就是把原来博主的贴过来,甚至很多面试官也是一知半解经不起推敲就来面候选人,最近结合我自己的学习和资料查阅,整理一下用Redi...
摘要:由于执行的原子性所以不要在中执行过长开销的程序,否则会验证影响其它请求的执行。同一个脚本生成的签名都是相同的,所以签名可以先在本地生成,然后在服务器上一次脚本,程序中只需保存和使用该签名即可。同样的脚本,是始终生成相同的签名的。 Last-Modified: 2019年6月5日15:59:34 参考链接 PHP使用Redis+Lua脚本操作的注意事项 《Redis官方文档》用Redi...
阅读 3404·2021-11-25 09:43
阅读 2580·2021-09-22 15:54
阅读 571·2019-08-30 15:55
阅读 941·2019-08-30 15:55
阅读 1978·2019-08-30 15:55
阅读 1723·2019-08-30 15:53
阅读 3446·2019-08-30 15:52
阅读 2024·2019-08-30 12:55