Redis分布式锁

使用这个分布式锁的前提是,你配置了Redis连接(Redis连接可看《连接Redis》目录)

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

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

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

RedisLock注解的参数解释

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

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

在MarsBean里面注入MarsRedisLock对象

  1. @MarsBean("testService")
  2. public class TestService {
  3. @MarsWrite("marsRedisLock")
  4. private MarsRedisLock marsRedisLock;
  5. }

加锁

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

解锁

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

单独弄一个redis来做分布式锁

  • lock方法和unlock方法都有两个重载,上面的示例是使用的配置的Redis连接
  • 如果你想单独弄一个redis来做分布式锁,那么可以调用另一个重载方法,将jedis对象传进去即可,使用开发环境的自动补全功能可以看到另一个重载方法的参数列表