起因:随着项目的进一步推广,数据量的增大,直接访问mysql数据库获取数据所使用的时间越来越长,为解决当前主要矛盾,决定引入redis非关系型数据库作为缓存层,使得数据并不能直接命中数据库,减少访问数据库带来的压力,从而加快运行速度。
1. Redisson实现分布式锁机制
分布式锁的核心
- 加锁
- 锁删除:一定不能因为锁提前超时导致删除非自己的锁
- 锁超时:如果业务没有执行完就应该给锁延时
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.12.1</version>
</dependency>
Java实现代码
@Configuration
public class controller {
@Autowired
RedissonClient redissonClient;
@GetMapping("/redisson")
@ResponseBody
public String redissonLock(){
RLock rLock = redissonClient.getLock("orderId");
System.out.println("开启锁**********");
try {
//如果有锁等待5秒,加锁后持有30秒
rLock.tryLock(5, 30, TimeUnit.SECONDS);
System.out.println("获取锁*********");
}catch (Exception ex){
ex.printStackTrace();
} finally {
System.out.println("释放锁*********");
rLock.unlock();
}
return "redisson";
}
}
redisson默认就是加锁30秒,建议也是30秒以上,默认的lockWatchdogTimeout会每隔10秒观察一下,待到20秒的时候如果主进程还没有释放锁,就会主动续期30秒
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!