数据库任务定时同步到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); }