当前位置 : 主页 > 编程语言 > java >

Spring Boot + Redis 实现分布式锁,还有谁不会??

来源:互联网 收集:自由互联 发布时间:2022-09-02
作者:jingQ\来源:https://www.sevenyuan.cn/ 一、业务背景 有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响。

作者:jingQ\来源:https://www.sevenyuan.cn/

一、业务背景

有些业务请求,属于耗时操作,需要加锁,防止后续的并发操作,同时对数据库的数据进行操作,需要避免对之前的业务造成影响。


二、分析流程

使用 Redis 作为分布式锁,将锁的状态放到 Redis 统一维护,解决集群中单机 JVM 信息不互通的问题,规定操作顺序,保护用户的数据正确。

梳理设计流程

  • 新建注解 @interface,在注解里设定入参标志
  • 增加 AOP 切点,扫描特定注解
  • 建立 @Aspect 切面任务,注册 bean 和拦截特定方法
  • 特定方法参数 ProceedingJoinPoint,对方法 pjp.proceed() 前后进行拦截
  • 切点前进行加锁,任务执行后进行删除 key
  • 核心步骤:加锁、解锁和续时

    加锁

    使用了 RedisTemplate 的 opsForValue.setIfAbsent 方法,判断是否有 key,设定一个随机数 UUID.random().toString,生成一个随机数作为 value。

    从 redis 中获取锁之后,对 key 设定 expire 失效时间,到期后自动释放锁。

    按照这种设计,只有第一个成功设定 Key 的请求,才能进行后续的数据操作,后续其它请求由于无法获得

    上一篇:Postman使用
    下一篇:没有了
    网友评论