看到很多人使用redis做分布式锁,公司中有简单的使用redis做分布式锁,
我们需要怎样的分布式锁
- 可以保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器-上的一个线程执行。
- 这把锁要是一把可重入锁(避免死锁)
- 这把锁最好是一把阻塞锁(根据业务需求考虑要不要这条)
- 这把锁最好是一把公平锁(根据业务需求考虑要不要这条)
- 有高可用的获取锁和释放锁功能
- 获取锁和释放锁的性能要好
举个简单的栗子,发送验证码,防止用户重复点击,说简单也就是表单的重复提交:
我使用的是setIfAbsent方法:这个方法就是先判断对应的key有没有,如果没有就加进去,2.1版本之后可以指定过期时间,添加成功返回true
失败返回false
通过这个方法我们就可以实现一个简单的锁了:
测试方法:
@GetMapping("/testLock/{userId}")
public String testLock(@PathVariable("userId") Integer userId) {
//每个用户 每五秒请求一次
Boolean aBoolean = stringRedisTemplate.opsForValue().setIfAbsent(userId+"", "das",3L, TimeUnit.SECONDS);
if (!aBoolean) {
return "请求速度太快了...";
}
return "欢迎光临";
}