有3个定时任务:
A:每秒执行一次消费延迟队列(以topic_命名开头,以list存储的redis)数据,审核文章,存入article数据库中发布成功。
B:每分钟执行一次未来数据(以future_命名开头,以set存储的redis)定时刷新。(这个刷新就是把未来数据变成延迟队列的数据)
C:每5分种执行将数据库5分钟之内会被执行的数据同步到缓存。同步后为未来数据。
ps:只有审核通过,也就是被A执行的文章才能被发布
发布一个文章:
先把文章基本信息存入到news数据库。判断发布时间是否在5分钟以内或者更早,
如果是:直接存入消费延迟队列和tesk数据库,被A消费审核后删除有关的数据。
如果不是:只存tesk数据库,每5分钟给一次触发C的机会,如果触发成功将会有触发B的机会,成功后就能触发A。
总结:
@Autowired
private CacheService cacheService;
//耗时338233
@Test
public void testPiple1(){
long start =System.currentTimeMillis();
for (int i = 0; i <10000 ; i++) {
Task task = new Task();
task.setTaskType(1001);
task.setPriority(1);
task.setExecuteTime(new Date().getTime());
cacheService.lLeftPush("1001_1", JSON.toJSONString(task));
}
System.out.println("耗时"+(System.currentTimeMillis()- start));
}
//使用管道技术执行10000次自增操作共耗时:1784毫秒
//使用管道技术执行10000次自增操作共耗时:1452毫秒
@Test
public void testPiple2(){
long start = System.currentTimeMillis();
//使用管道技术
List<Object> objectList = cacheService.getstringRedisTemplate().executePipelined(new RedisCallback<Object>() {
@Nullable
@Override
public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
for (int i = 0; i <10000 ; i++) {
Task task = new Task();
task.setTaskType(1002);
task.setPriority(1);
task.setExecuteTime(new Date().getTime());
redisConnection.lPush("1002_1".getBytes(), JSON.toJSONString(task).getBytes());
}
return null;
}
});
System.out.println("使用管道技术执行10000次自增操作共耗时:"+(System.currentTimeMillis()-start)+"毫秒");
}