1.前言
这是作者进行记录自己学习redis缓存技术的记录贴,作者会持续更新下去的。
2.分析
2.1缓存预热的优点
解决了接口首次响应过慢的问题, 可以让用户始终访问很快
2.2缓存预热的缺点
1.增加开发成本(需要额外的开发,设计)
2.预热的时机和时间如果错了,有可能缓存的数据不正确或者太老
3.需要占用额外的空间
2.3怎么进行缓存预热?
1.定时任务
2.手动触发
3.定时触发预热
3.1定时执行预热会遇到的问题
主要是进行项目部署的时候,不会是仅仅进行部署到单机上,但是这就会出现一个问题,多个服务器上的项目都会进行去执行这个定时任务,那问题就来了,都去执行定时任务,会导致很多问题,至少也会导致服务器资源的浪费,比如我们有上千台服务器,都去执行这个任务,那是不是会造成很大的性能浪费呢?
3.2限制只有单机去执行定时任务
4.分布式锁会遇到的问题和解决方案
4.1可能会出现的问题
4.2实现分布式锁的方案
4.3抢锁机制
核心思想就是: 先来的人先把数据改成自己的标识(服务器IP) => 后来的人发现标识已经存在,就会抢锁失败,继续等待
等先来的人执行方法结束,把标识情况,其他人继续抢锁
5.如果是多机redis怎么办?--- redis红锁
Redisson--红锁(Redlock)--使用/原理-CSDN博客
6.为什么使用分布式锁?而不是锁?
7.定时任务如何实现?
7.1哪些方式可以实现定时任务
7.2采用第一种方式需要怎么做?
1.主类开启@EnableScheduling
2.给需要执行定时任务方法进行添加@Scheduling注解,指定cron表达式或者执行频率
7.3只有傻子才会背cron表达式
8.代码实现
8.1引入redisson
<!-- redission -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.5</version>
</dependency>
8.2配置redisson
8.3进行校验看门狗机制和实现分布式锁
当我们默认进行使用看门狗的时候,我们应该不进行设置过期时间,redis会进行默认设置30秒的过期时间,当时间还有20秒的时候就会自动续期到30秒,由此反复。
@Test
void testWatchDog() {
RLock lock = redissonClient.getLock("yangpao:precachejob:docache:lock");
try {
// 只有一个线程可以获得锁
if (lock.tryLock(0, -1, TimeUnit.MILLISECONDS)) {
Thread.sleep(3000000);
System.out.println("getLock: " + Thread.currentThread().getId());
}
} catch (Exception e) {
log.info("doCacheRecommendUser error", e);
} finally {
// 只能释放自己的锁
if (lock.isHeldByCurrentThread()) {
System.out.println("unLock: " + Thread.currentThread().getId());
lock.unlock();
}
}
}