RedisLock锁粒度和如何获取动态参数

Blade 未结 2 140
18200153543
18200153543 剑者 2024-10-28 10:54

一、该问题的重现步骤是什么?

1. 使用RedisLock对方法重复提交控制


二、问题咨询?

RedisLock 锁的粒度是session用户当前访问 还是 整个集群下这个方法

另外如何通过el或者@去获取AuthUtil中的参数


三、你正在使用的是什么产品,什么版本?在什么操作系统上?

Bladex v4.2.0.release windows


2条回答
  • 2024-10-28 11:16
    @RedisLock(value = "lock:tool:sign:tool",param = "T(org.springblade.core.secure.utils.AuthUtil).getUserId()")

    现在用的这个方法可以拿到

    0 讨论(0)
  • 2024-10-28 11:25

    目前是项目全局的控制,可以直接通过springel获取调用bean的方法。

    也可以自己注册自定义函数,让调用更加优雅。

    作者追问:2024-10-28 11:31

    可以这样理解吗?比如用户A,不加额外的param动态参数,调用了方法abc(),此时即便是集群环境,因为用的锁的redis,意味着A的调用没有结束谁都不能进入该方法

    回答: 2024-10-28 11:33

    是的,没有param,那就是统一的一个key,不管哪个服务来调用,key都是一样的。上一个请求没结束,key就不会释放,之后来的请求rediskey还在自然就被锁住无法调用了。

    作者追问:2024-10-28 14:58

    过程发现这个注解

    @RateLimiter

    但是在文档中没有找到对应的使用方法,自行尝试了

    1、开启分布式配置

    blade:

    #分布式锁配置

     lock:

     enabled: true

     address: redis://127.0.0.1:6379

     password: 123456

    2、在方法上增加注解

    @RateLimiter(value = "lock:tool:sign:ttl",param = "T(org.springblade.core.secure.utils.AuthUtil).getUserId()") 

    或者

    @RateLimiter(value = "lock:tool:sign:ttl")

    发现没有生效,跟其源码

    RedisRateLimiterAspect

    发现注解没有生效。

    3、同样配置使用注解@RedisLock可以进去

    RedisRateLimiterAspect

    遂求指导

    作者追问:2024-10-28 15:01

    显示有问题

    意思就是同样的注解RedisLock可以进到RedisLockAspect跟踪

    但是使用RateLimiter进不去RedisRateLimiterAspect

    猜测没有生效。是有什么配置没有到位吗

    作者追问:2024-10-28 16:27

    找到了为啥不生效了 需要增加这个配置。

    image.png

    image.png


    0 讨论(0)
提交回复