redis自增,定时任务更新评论数和阅读数

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>

评论数的方法一致

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值