# **SpringBoot** 分布式锁 @klock详解

SpringBoot 分布式锁 @klock详解

@Klock( name = "testKey", //key默认为lock.包名.类名-方法名;key.com.example.springmvc.klock.service.UserServiceImpl-test 如果配置了name则为lock.name-方法名;key.testKey-test
        lockType= LockType.Fair,//锁为公平锁
        waitTime = 10, //获取锁最长等待时间。10s
        leaseTime = 300,//获得锁后,自动释放锁的时间300s
        lockTimeoutStrategy = LockTimeoutStrategy.FAIL_FAST, //请求过来后获取锁超时的处理策略 这里配置的直接返回失败
        releaseTimeoutStrategy = ReleaseTimeoutStrategy.FAIL_FAST)//超过300s后超时自动释放,锁处理策略 这里配置的直接返回失败,也可以配置不做处理
public void test(){
    
    
    log.info("缓存");

}

image-20230626111126436

@Klock可以标注四个参数,作用分别如下

name:lock的name,对应redis的key值。默认为:lock.包名.类名-方法名。 可根据业务指定name, 规则为: lock.name-方法名。

lockType:锁的类型,目前支持(可重入锁,公平锁,读写锁)。默认为:公平锁

waitTime:获取锁最长等待时间。默认为:60s。同时也可通过spring.klock.waitTime统一配置

leaseTime:获得锁后,自动释放锁的时间。默认为:60s。同时也可通过spring.klock.leaseTime统一配置

lockTimeoutStrategy: 加锁超时的处理策略,可配置为不做处理、快速失败、阻塞等待的处理策略,默认策略为不做处理

customLockTimeoutStrategy: 自定义加锁超时的处理策略,需指定自定义处理的方法的方法名,并保持入参一致。

releaseTimeoutStrategy: 释放锁时,持有的锁已超时的处理策略,可配置为不做处理、快速失败的处理策略,默认策略为不做处理

customReleaseTimeoutStrategy: 自定义释放锁时,需指定自定义处理的方法的方法名,并保持入参一致。

加锁超时处理策略(LockTimeoutStrategy):

  • NO_OPERATION 不做处理,继续执行业务逻辑
  • FAIL_FAST 快速失败,会抛出KlockTimeoutException
  • KEEP_ACQUIRE 阻塞等待,一直阻塞,直到获得锁,但在太多的尝试后,会停止获取锁并报错,此时很有可能是发生了死锁。
  • 自定义(customLockTimeoutStrategy) 需指定自定义处理的方法的方法名,并保持入参一致,指定自定义处理方法后,会覆盖上述三种策略,且会拦截业务逻辑的运行。

释放锁时超时处理策略(ReleaseTimeoutStrategy):

  • NO_OPERATION 不做处理,继续执行业务逻辑
  • FAIL_FAST 快速失败,会抛出KlockTimeoutException
  • 自定义(customReleaseTimeoutStrategy) 需指定自定义处理的方法的方法名,并保持入参一致,指定自定义处理方法后,会覆盖上述两种策略, 执行自定义处理方法时,业务逻辑已经执行完毕,会在方法返回前和throw异常前执行。

锁超时处理流程

企业微信截图_f121de39-f6ee-43d1-ae80-44583e29996f

自定义超时处理策略

@Klock(name="test2Key", waitTime=2, customLockTimeoutStrategy = "customLockTimeout")
public void test2(String name, String age) {
    
    
    try {
    
    
        TimeUnit.SECONDS.sleep(3);
        log.info("acquire lock");
    } catch (InterruptedException e) {
    
    
        e.printStackTrace();
    }
}

private String customLockTimeout(String name, String age) {
    
    
    log.info("customLockTimeout name: " + name + " age: " + age);
    return "超时报错";
}

image-20230626112510883

image-20230626112612299

猜你喜欢

转载自blog.csdn.net/itScholar001/article/details/131394046