zoukankan      html  css  js  c++  java
  • springboot+redis定时更新浏览数

    启动类添加注解:

    @EnableScheduling

    定时任务类:

    先获取所有的key,再将key转为int类型得到id,通过key获取得到redis中的值。

    然后调用更新方法,为了避免重复更新,删除redis中的key-value。

    0/10 * * * * ?表示每10秒执行一次

    package com.yao.common.conf;
    
    
    import com.yao.common.base.redis.RedisUtils;
    import com.yao.common.pojo.News;
    import com.yao.manage.info.mapper.newsMapper;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Set;
    
    /**
     * 定时任务
     */
    @Component
    public class QuartzConf {
    
    
        @Autowired
        private newsMapper newsMapper;
    
        @Autowired
        private RedisUtils redisUtils;
    
    
        @Scheduled(cron =" 0 0/3 * * * ?   ")
        public void updateViews() throws Exception {
           Set<String> keyset= redisUtils.keys("*");
            System.out.println(keyset);
            List<Integer> list = new ArrayList<>();
            for(String key : keyset) {   //遍历keys
                if (!key.isEmpty() && key != null) {
                    String key1=key.trim();
                System.out.println("LLL:"+key1);
                  if (null !=key1  ){
                     Integer id=Integer.parseInt(key1); //对字符串转换为Integer类型
                      list.add(id);
                  }
                }
    
    
            }
            for( Integer id: list) {
    
                News news = newsMapper.getNewsById(id);
    
                Integer views = (Integer) redisUtils.get(id+"");
                news.setViews(views);
                System.out.println("浏览数:" + views);
    //                     news.setViews(views);
                newsMapper.updateViews(news);
                redisUtils.del(id+"");
            }
    
    
        }
    }
    

    业务serveice:

     public News getNewsById(Integer newsId) {
    
            News newsById = newsMapper.getNewsById(newsId);
            Set<String> keyset= redisUtils.keys(newsById.getId()+"");
            System.out.println("keyset"+keyset);
            if (keyset!=null && !keyset.isEmpty()) {
                for (String key : keyset) {   //遍历keys
                    if (!key.isEmpty() && key != null) {
                        String key1 = key.trim();
                        System.out.println("key1: " + key1);
                        Integer views = (Integer) redisUtils.get(key);
                        if (views > 0) {
                            views = views + 1;
                            redisUtils.set(newsById.getId() + "", views);
                        } else {
                            redisUtils.set(newsById.getId() + "", newsById.getViews() + 1);
                        }
                    } else {
                        redisUtils.set(newsById.getId() + "", newsById.getViews() + 1);
                    }
                }
            }else {
                Integer v=newsById.getViews()+1;
                redisUtils.set(newsById.getId() + "", v);
                System.out.println("id:"+newsById.getId()+": "+v+"个");
            }
    
            return newsById;
        }

    以上把浏览数保存到redis中,出于简单,我用主键id+" ",做为key。

    不经一番彻骨寒,哪有梅花扑鼻香?
  • 相关阅读:
    谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)
    (转) 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文)
    (转) Supercharging Style Transfer
    Summary on deep learning framework --- TensorFlow
    (转) How a Kalman filter works, in pictures
    Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box)
    C、C++基础和编程风格 (转)
    Linux && shell
    求最短路径的条数
    一个链表中包含环,请找出该链表的环的入口结点。
  • 原文地址:https://www.cnblogs.com/zongyao/p/13831122.html
Copyright © 2011-2022 走看看