使用Redis实现分布式锁

作者 : 开心源码 本文共769个字,预计阅读时间需要2分钟 发布时间: 2022-05-13 共211人阅读

分布式锁详情

高并发场景检查会用到分布式锁,比方秒杀场景库存控制等。
一般分布式锁有几种实现方式

  • 数据库实现
  • 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实现分布式锁

发表回复