数据库任务定时同步到redis

把数据库任务定时存储到redis:当前时间 < 执行时间 <= 预设时间(当前时间+5分钟)

预加载:如果任务量特别大,一次将数据库所有future任务全都加载到redis内存,可能会导致阻塞。

1.清理缓存中的数据

2.查询小于未来5分钟的所有任务

3.新增任务到redis

 

  /**
     * 数据库任务定时同步到redis中,每5分钟执行一次
     */
    @PostConstruct //开机同步。依赖注入完成后,初始化之前被调用,用于执行一些必要的初始化操作
    @Scheduled(cron = "0 */5 * * * ?")
    public void reloadData(){
        //1、清理缓存中的数据
        clearCache();

        //2、查询符合条件的任务小于未来五分钟的数据
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.MINUTE, 5);
        List<Taskinfo> taskinfoList = taskinfoMapper.selectList(Wrappers.<Taskinfo>lambdaQuery().lt(Taskinfo::getExecuteTime, calendar.getTime()));

        //3、把任务添加到redis中,拉取任务会将任务从数据库中删除并修改任务日志状态
        if(taskinfoList != null && taskinfoList.size() > 0){
            for (Taskinfo taskinfo : taskinfoList) {
                Task task = new Task();
                BeanUtils.copyProperties(taskinfo, task);
                task.setExecuteTime(taskinfo.getExecuteTime().getTime());
                addTaskToCache(task);
            }
        }
        log.info("数据库的任务同步到了redis");
    }

    /**
     * 清理缓存中的数据
     */
    public void clearCache(){
        Set<String> topicKeys = cacheService.scan(ScheduleConstants.TOPIC + "*");
        Set<String> futureKeys = cacheService.scan(ScheduleConstants.FUTURE + "*");
        cacheService.delete(topicKeys);
        cacheService.delete(futureKeys);
    }

 

posted @ 2023-07-05 15:41  佛系粥米  阅读(143)  评论(0编辑  收藏  举报