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<String> keys = redisTemplate.keys("VIEW_COUNT"+"*"); List<ViewCountQuery> 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 id="bathUpdateArticleViewCount" parameterType="list"> update ms_article set view_counts = <foreach collection="list" item="item" separator="" open="CASE id" close="end"> when #{item.articleId} then #{item.viewCount} </foreach> where id in <foreach collection="list" open="(" item="item" close=")" separator=","> #{item.articleId,jdbcType=BIGINT} </foreach> </update>
评论数的方法一致