redis定时任务自增实现阅读数和评论数更新
阅读数和评论数 ,考虑把阅读数和评论数 增加的时候 放入redis incr自增,使用定时任务 定时把数据固话到数据库当中
点击文章的方法里面实现文章阅读数自增
public ArticleVo findArticleById(Long id) {
Article article = articleMapper.selectById(id);
String redisKey ="VIEW_COUNT"+id.toString();
Integer viewCounts = article.getViewCounts();
redisTemplate.opsForValue().set(redisKey,viewCounts+"");
redisTemplate.opsForValue().increment(redisKey,1);
return copy(article,true,true,true,true);
}
定时任务 遍历redis中前缀是VIEW_COUNT的所有key,通过subString方法获取文章id,获取key存储的阅读数,把文章id和阅读数放入ViewCountQuery对象中,对象放入list集合中,批量更新
注意:redisTemplate 是StringRedisTemplate的对象。RedisTemplate的keys方法获取的集合为空
@Scheduled(cron = "0 30 4 ? * *")//每天凌晨四点半触发
public void updateViewCount(){
log.info("更新文章阅读数");
Set keys = redisTemplate.keys("VIEW_COUNT"+"*");
List list = new ArrayList<>();
if(!keys.isEmpty()){
for (String key : keys) {
ViewCountQuery query = new ViewCountQuery();
String ArticleIdStr = key.substring("VIEW_COUNT".length(), key.length());
String viewCount = redisTemplate.opsForValue().get(key);
log.info("Id{}" + ArticleIdStr);
log.info("viewCount{}"+viewCount);
long articleId = Long.parseLong(ArticleIdStr);
query.setArticleId(articleId);
query.setViewCount(Integer.parseInt(viewCount));
list.add(query);
}
}
if (list.size()>0) {
articleMapper.bathUpdateArticleViewCount(list);
}
}
批量更新
update ms_article set view_counts = when #{item.articleId} then #{item.viewCount} where id in#{item.articleId,jdbcType=BIGINT}
评论数的方法一致



