redis如何实现分布式锁
Redis  /  管理员 发布于 7年前   174
分布式锁需要解决的问题
互斥性:任意时刻只能有一个客户端拥有锁,不能同时多个客户端获取
安全性:锁只能被持有该锁的用户删除,而不能被其他用户删除 (推荐学习:Redis视频教程)
死锁:获取锁的客户端因为某些原因而宕机,而未能释放锁,其他客户端无法获取此锁,需要有机制来避免该类问题的发生
容错:当部分节点宕机,客户端仍能获取锁或者释放锁
如何通过Redis实现分布式锁:(非完善方法)
SETNX key value :如果key不存在,则创建并赋值
时间复杂度: 0(1)
返回值:设置成功,返回1;设置失败,返回0。
但是此时我们获取的key是长期有效的,所以我们应该如何解决长期有效的问题呢?
EXPIRE key seconds
设置key的生存时间,当key过期时(生存时间为0) ,会被自动删除
缺点:原子性得不到满足
下面是伪代码
//该程序存在危险,如果执行到第二行就崩溃了,则此时key会被一直占用而无法被释放RedisService redisService = SpringUtils.getBean(Redi sService.class); long status = redisService.setnx(key, "1");if(status == 1) {redisService.expire(key, expire);//执行独占资源逻辑doOcuppiedWork();}
如何通过Redis实现分布式锁:(正确方式)
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX second :设置键的过期时间为second秒
PX millisecond :设置键的过期时间为millisecond毫秒
NX :只在键不存在时,才对键进行设置操作
XX:只在键已经存在时,才对键进行设置操作
SET操作成功完成时,返回OK ,否则返回nil
下面是伪代码
RedisService redisService = SpringUtils.getBean(RedisService.class); .String result = redisService.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);if ("OK".equals(result)) {//执行独占资源逻辑doOcuppiedWork();}
大量的key同时过期的注意事项
集中过期,由于清除大量的key很耗时,会出现短暂的卡顿现象
解放方案:在设置key的过期时间的时候,给每个key加上随机值
更多Redis相关技术文章,请访问Redis入门教程栏目进行学习!
以上就是redis如何实现分布式锁的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号