基于Redis的分布式锁Klock的使用

萧远
2023-12-01

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-klock-starter</artifactId>	          
    <version>1.4-release</version>
</dependency>

application.yml中配置

spring:
  redis:
    #数据库索引
    database: 7
    #客户服务器
    host: 127.0.0.1
    port: 6379
    password: 123456
    jedis:
      pool:
        #最大连接数
        max-active: 100
        #最大阻塞等待时间(负数表示没限制)
        max-wait: -1ms
        #最大空闲
        max-idle: 8
        #最小空闲
        min-idle: 1
        time-between-eviction-runs: 2000ms
    #连接超时时间
    timeout: 10000ms
  klock:
    address: redis://127.0.0.1:6379
    password: 123456
    database: 7
    #获取锁最长阻塞时间
    waitTime: 60
    #已获取锁后自动释放时间
    leaseTime: 600

controller调用

public class StudentController{
    @Autowired
    private StudentService studentService;
    
    @PostMapping("save")
    AjaxJson<String> save(@RequestBody  StudentVo vo){
        AjaxJson<String> json = new AjaxJson();
        try{
            //锁
            String lockKey = "STUDENT_SAVE" + vo.getNo();
            studentService.save(vo,lockKey);
        }catch (Exception e){
            log.error(e.getMessage());
            json.setErrMsg( e.getMessage() );
        }
        return json;
    }
}

StudentVo

@Data
public class StudentVo {
    /**
     * 学号
     */
    private String no;
    /**
     * 姓名
     */
    private String name;
}

Service接口

public interface StudentService{
    void save(StudentVo vo,String lockKey) throws ParseException;
}

实现类

@Service("studentService")
public class StudentServiceImpl implements StudentService {
    @Override
    //加锁
    @Klock(keys = {"#lockKey"})
    public void save(StudentVo vo,String lockKey) throws ParseException {
    ........
    }
}

注意
不能在加锁方法的类中调用加锁方法,因为Klock分布式锁是直接锁这个类,而不是只锁方法。

不同类型的锁字符串前缀最好不一样,防止字符串相同导致多个方法的锁同时被锁住。

 类似资料: