使用Redis实现分布式锁
分布式锁详情
高并发场景检查会用到分布式锁,比方秒杀场景库存控制等。
一般分布式锁有几种实现方式
- 数据库实现
- zookeeper实现
- redis实现
分布式锁场景
分布式锁有两种场景:
抢不到锁的请求,允许丢弃
image.png并发请求,不管哪一条都必需要解决的场景
image.png
实现原理
Redis中使用 SET 的NX参数实现:
SET key value [EX seconds] [PX milliseconds] [NX|XX]NX参数表示只在键不存在时,才对键进行设置操作,XX参数表示键值存在是才能操作。未设置NX|XX参数时,操作成功返回OK。使用了NX|XX参数时导致设置失败返回nil。
可丢弃分布式锁java代码,直接返回false,直接跳过:
boolean success = redisTemplate.opsForValue().setIfAbsent(redisKey, lockValue, expireInSecond, TimeUnit.SECONDS);并发请求实现
for (int i = 0; i < retryCount; i++) { boolean success = redisTemplate.opsForValue().setIfAbsent(redisKey, lockValue, expireInSecond, TimeUnit.SECONDS); if (success) { flag = true; break; } try { TimeUnit.MILLISECONDS.sleep(waitIntervalInMS); } catch (Exception ignore) { logger.warn("redis lock fail: " + ignore.getMessage()); } }常见坑
- 具备原子性的操作才能保证锁唯一获取
- redis的单点故障主从切换带来的两个用户端同时持有锁的问题
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 使用Redis实现分布式锁
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 使用Redis实现分布式锁