需求:点击菜单时统计菜单的点击数量,由于菜单点击很频繁,采用redis缓存再定时存入mysql
// 添菜单使用情况存入redis
public PageData addRedis(PageData pd) {
// 将对象转换成json字符串
String pdJson = JSON.toJSONString(pd);
// 存入的时候key值前面加入应该常量取出来好取
redis.set(MENUS_CLINK_REDIS+"_"+StringUtil.getUUID(),pdJson);
return RespUtil.getSuccessResp();
}
// 从redis取出存入mysql
@Scheduled(cron=" 0 0/2 * * * ?") // 二分钟执行一次
public void addMySql() {
Set<String> keys = redis.scan(MENUS_CLINK_REDIS+"_"+"*");
if (keys != null) {
for (String key : keys) {
String pdJson = redis.get(key);
PageData pageData = JSON.parseObject(pdJson, PageData.class);
countMenusMapper.add(pageData);
redis.delete(key);
}
}
}
@EnableScheduling //开启定时任务
@SpringBootApplication
public class Start {
public static void main(String[] args) throws Exception {
SpringApplication.run(Start.class, args);
}
}
上面的定时任务在只有一个定时任务才能顺利执行,要是有多个定时任务就需要一个线程池,进行异步调用。
加上一个@EnableAsync
@EnableScheduling //开启定时任务
@EnableAsync //开启线程异步
@SpringBootApplication
public class Start {
public static void main(String[] args) throws Exception {
SpringApplication.run(Start.class, args);
}
}
配置应一个线程池类
@Configuration
public class ScheduleConfiguration implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(this.getTaskScheduler());
}
private ThreadPoolTaskScheduler getTaskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(20);
taskScheduler.setThreadNamePrefix("schedule-pool-");
taskScheduler.initialize();
return taskScheduler;
}
}
然后开启定时任务
@Async // 定时方法上加入进行异步
@Scheduled(cron=" 0 0/2 * * * ?") // 二分钟执行一次
public void add1() {
}
@Async // 定时方法上加入进行异步
@Scheduled(cron=" 0 0/2 * * * ?") // 二分钟执行一次
public void add2() {
}
这样就可以多个定时任务异步执行