V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Joker123456789
V2EX  ›  Java

来了,更加灵活的 Redis 分布式锁, Martian 框架发布 3.0.39 版本

  •  
  •   Joker123456789 · 2020-10-16 11:30:06 +08:00 · 1376 次点击
    这是一个创建于 1484 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正如标题所说,此次更新主要是优化了 Redis 分布锁的灵活性。

    在要加锁的方法上添加 RedisLock 注解

    @RedisLock(key = "自己定义一个 key", maxWait = 3000,
                retry = true, retryRate = 100, timeOut = 1000)
    public int insert(){
      return 1;
    }
    

    这个锁会在事务开启之前获取,在事务提交以后解锁,并且只对 MarsBean 有效,对 API 和 DAO 无效

    RedisLock 注解的参数解释

    • key: 唯一标识,保证全局唯一
    • retry: 如果获取锁失败,是否重试( true 是,false 否),只有设置为 true,下面的几个属性才生效 | 默认为 false
    • retryRate: 重试频率(多少毫秒重试一次)| 默认 100 毫秒
    • maxWait: 最大等待时间(重试多少毫秒以后,就放弃等待) | 默认 3000 毫秒
    • timeOut: 失效时间(多少毫秒后,自动解锁) | 默认 10000 毫秒

    如果你不需要锁住整个方法,只需要锁一小段代码,那么可以用下面的方式

    在 MarsBean 里面注入 MarsRedisLock 对象

    @MarsBean("testService")
    public class TestService {
    
        @MarsWrite("marsRedisLock")
        private MarsRedisLock marsRedisLock;
    
    }
    

    加锁

    LockModel lockModel = new LockModel();
    ockModel.setKey("设置一个 key,不同业务之间唯一,保证每次请求都是一样的 key");
    ockModel.setValue("设置一个唯一的 value,每次请求都是唯一的");
    // 失效时间
    ockModel.setTimeOut(10000);
    // 重试频率(每隔几毫秒重试一次)
    ockModel.setRetryRate(300);
    // 没获取到锁,是否重试
    lockModel.setRetry(true);
    // 最大重试时间(重试多久没成功,就直接放弃)
    ockModel.setMaxWait(5000);
    
    Boolean haslock = marsRedisLock.lock(lockModel);
    if(haslock){
        执行加锁后才能执行的代码
    }
    

    解锁

    marsRedisLock.unlock(lockModel.getKey(), lockModel.getValue());
    

    Martian 框架官网

    http://mars-framework.com

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 21:47 · PVG 05:47 · LAX 13:47 · JFK 16:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.