redis实现延迟任务_添加任务到数据库
1、添加任务到数据库
2、判断当前任务的执行时间
执行时间<=当前时间:存储到 list(当前消费队列)
当前时间<执行时间<=预设时间(预设时间=当前时间+5分钟):存储zset (未来数据队列),定时刷新从zset中将任务存入list。
一、添加任务
1、创建task类,用于接收添加任务的参数
2:创建TaskService
2.1 添加任务到数据库中
2.2 添加任务到redis中
2.2.1 如果任务的执行时间小于等于当前时间存入list 【立马要执行】
2.2 如果任务的执行时间大于当前时间,小于等于预设时间(未来5分钟)存入zset中【预加载部分是未来5分钟内要执行的】
3:测试
package com.heima.schedule.service.impl; import com.alibaba.fastjson.JSON; import com.heima.common.constants.ScheduleConstants; import com.heima.common.redis.CacheService; import com.heima.model.schedule.dtos.Task; import com.heima.model.schedule.pojos.Taskinfo; import com.heima.model.schedule.pojos.TaskinfoLogs; import com.heima.schedule.mapper.TaskinfoLogsMapper; import com.heima.schedule.mapper.TaskinfoMapper; import com.heima.schedule.service.TaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Calendar; import java.util.Date; @Service @Transactional @Slf4j public class TaskServiceImpl implements TaskService { /** * 添加延迟任务 * @param task * @return */ @Override public long addTask(Task task) { //1、添加任务到数据库中 boolean success = addTaskToDb(task); if(success){ //2、添加任务到redis中 addTaskToCache(task); } return task.getTaskId(); } @Autowired private CacheService cacheService; /** * 把任务添加到redis中 * @param task */ private void addTaskToCache(Task task) { String key = task.getTaskType() + "_" + task.getPriority(); //获取5分钟之后的时间 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MINUTE, 5); long nextScheduleTime = calendar.getTimeInMillis(); //2.1、如果任务的执行时间小于等于当前时间,存入list if(task.getExecuteTime() <= System.currentTimeMillis()){ cacheService.lLeftPush(ScheduleConstants.TOPIC+key, JSON.toJSONString(task)); }else if(task.getExecuteTime() <= nextScheduleTime){ //2。2、如果任务的执行时间大于当前时间,并且小于等于预设时间(未来5分钟),存入zset中 cacheService.zAdd(ScheduleConstants.FUTURE+key, JSON.toJSONString(task), task.getExecuteTime()); } } @Autowired private TaskinfoMapper taskinfoMapper; @Autowired private TaskinfoLogsMapper taskinfoLogsMapper; /** * 添加任务到数据库中 * @param task * @return */ private boolean addTaskToDb(Task task) { boolean flag = false; try{ //保存任务表 Taskinfo taskinfo = new Taskinfo(); BeanUtils.copyProperties(task, taskinfo); //不同的属性是execute_time,一个是long,一个是date taskinfo.setExecuteTime(new Date(task.getExecuteTime())); taskinfoMapper.insert(taskinfo); //设置taskId task.setTaskId(taskinfo.getTaskId()); //保存任务日志数据 TaskinfoLogs taskinfoLogs = new TaskinfoLogs(); BeanUtils.copyProperties(taskinfo, taskinfoLogs); taskinfoLogs.setVersion(1); //status 状态 0=int 1=EXECUTED 2=CANCELLED taskinfoLogs.setStatus(ScheduleConstants.SCHEDULED); taskinfoLogsMapper.insert(taskinfoLogs); flag = true; }catch (Exception e){ e.printStackTrace(); } return flag; } }
package com.heima.schedule.service.impl; import com.heima.model.schedule.dtos.Task; import com.heima.schedule.ScheduleApplication; import com.heima.schedule.service.TaskService; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.util.Date; import static org.junit.jupiter.api.Assertions.*; @SpringBootTest(classes = ScheduleApplication.class) @RunWith(SpringRunner.class) class TaskServiceImplTest { @Autowired private TaskService taskService; @Test public void addTask() { Task task = new Task(); task.setTaskType(100); task.setPriority(50); task.setParameters("task test".getBytes()); task.setExecuteTime(new Date().getTime()+5000); long taskId = taskService.addTask(task); System.out.println(taskId); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!