百万数据量下如何对接口数据进行缓存预热(一)

104 阅读2分钟

1.前言

这是作者进行记录自己学习redis缓存技术的记录贴,作者会持续更新下去的。

2.分析

2.1缓存预热的优点
解决了接口首次响应过慢的问题, 可以让用户始终访问很快

2.2缓存预热的缺点
1.增加开发成本(需要额外的开发,设计)
2.预热的时机和时间如果错了,有可能缓存的数据不正确或者太老
3.需要占用额外的空间

2.3怎么进行缓存预热?
1.定时任务
2.手动触发

3.定时触发预热

3.1定时执行预热会遇到的问题
主要是进行项目部署的时候,不会是仅仅进行部署到单机上,但是这就会出现一个问题,多个服务器上的项目都会进行去执行这个定时任务,那问题就来了,都去执行定时任务,会导致很多问题,至少也会导致服务器资源的浪费,比如我们有上千台服务器,都去执行这个任务,那是不是会造成很大的性能浪费呢?

3.2限制只有单机去执行定时任务

image.png

4.分布式锁会遇到的问题和解决方案

4.1可能会出现的问题

image.png

4.2实现分布式锁的方案

image.png

4.3抢锁机制
核心思想就是: 先来的人先把数据改成自己的标识(服务器IP) => 后来的人发现标识已经存在,就会抢锁失败,继续等待

等先来的人执行方法结束,把标识情况,其他人继续抢锁

5.如果是多机redis怎么办?

--- redis红锁 Redisson--红锁(Redlock)--使用/原理-CSDN博客

6.为什么使用分布式锁?而不是锁?

image.png

7.定时任务如何实现?

7.1哪些方式可以实现定时任务

image.png

7.2采用第一种方式需要怎么做?
1.主类开启@EnableScheduling
2.给需要执行定时任务方法进行添加@Scheduling注解,指定cron表达式或者执行频率

7.3只有傻子才会背cron表达式
在线Cron表达式生成器/

在线crontab表达式执行时间计算 - 码工具/

8.代码实现

8.1引入redisson

1738666933001.png

8.2配置redisson image.png

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();
    }
}

}

8.4redisson搭配Spring Scheduler实现定时针对重点用户预热数据

image.png ————————————————