<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-klock-starter</artifactId>
<version>1.4-release</version>
</dependency>
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
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;
}
}
@Data
public class StudentVo {
/**
* 学号
*/
private String no;
/**
* 姓名
*/
private String name;
}
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分布式锁是直接锁这个类,而不是只锁方法。
不同类型的锁字符串前缀最好不一样,防止字符串相同导致多个方法的锁同时被锁住。