zoukankan      html  css  js  c++  java
  • java 如何快速的获取浏览量

    最近公司做了一个类似 于发帖,交友圈一个这样的功能 在如何精确快速的获取用户的浏览量,且及时的更新显示,最初我是这样想,把每条帖子内容浏览量放到reids 里面,但是redis只是用来存零时数据,想想觉的还是放表里面好,在发布的帖子表增加一个字段作为该帖子的浏览量,但是每次从表里面读更新浏览量,这样肯定是不明智的做法,直接看下面代码

    1:当用户浏览帖子内容时 根据KEY 从redis 获取改帖子的浏览量如果存在,那么就在以前的基础上+1 否则就从数据库查询出来再+1然后放到缓存里面

            // 浏览量
            if (redisClient.hexists(CAMPUS_CIRCLE_PAGEVIEWS_KEY, id.toString())) {
                redisClient.hincrBy(CAMPUS_CIRCLE_PAGEVIEWS_KEY, id.toString(), 1);
            } else {
                Integer count = campusCircle.getCount() + 1;
                redisClient.hincrBy(CAMPUS_CIRCLE_PAGEVIEWS_KEY, id.toString(), count);
            }
    CAMPUS_CIRCLE_PAGEVIEWS_KEY 这个是帖子浏览量的key
    id.toString()是帖子ID
    2:写一个定时任务 每10 分钟同步到数据库里面 这个根据业务需求,20分钟30 随便你
    /**
     * 定时任务
     * 
     * @author ckj
     * 
     */
    @Component
    public class CampusCircleTask {
        private static final Logger LOGGER = LoggerFactory.getLogger(CampusCircleTask.class);
        @Autowired
        private CampusCircleDao campusCircleDao;
        @Autowired
        private RedisClient redisClient;
        private static final String CAMPUS_CIRCLE_PAGEVIEWS_KEY = "campus:circle:pageviews";// 校园圈浏览量
        
        @Scheduled(cron="0 0/10 * * * *")
        public void synchronizePageviews() {
            LOGGER.info("CampusCircleTask start");
            Map<String, String> map = redisClient.hgetAll(CAMPUS_CIRCLE_PAGEVIEWS_KEY);
            for (Map.Entry<String, String> entry : map.entrySet()) {
                CampusCircle campusCircle = campusCircleDao.getById(Integer.parseInt(entry.getKey()));
                campusCircle.setCount(Integer.parseInt(entry.getValue()));
                campusCircleDao.update(campusCircle);
            }
            LOGGER.info("CampusCircleTask end");
        }
    }

      3:页面显示的时候 由于我们存到redis是 Hash 形式的,这时可要遍历Hash 获取

     
        /**
         * 从redids 获取 浏览量
         * 
         * @param campusCircleId 帖子ID
         * @return
         */
        public Integer getPageviews(Integer campusCircleId) {
            Integer count = 0;
            Map<String, String> map = redisClient.hgetAll(CAMPUS_CIRCLE_PAGEVIEWS_KEY);
            for (Map.Entry<String, String> entry : map.entrySet()) {
                if (campusCircleId.toString().equals(entry.getKey())) {
                    count = Integer.parseInt(entry.getValue());
                    break;
                }
            }
            return count;
        }
  • 相关阅读:
    Python xlrd.biffh.XLRDError: Excel xlsx file; not supported
    Python 报/usr/bin/python^M: bad interpreter: No such file or directory
    Linux curl命令
    课程学习总结报告
    信息安全实验二
    结合中断上下文切换和进程上下文切换分析linux内核的一般执行过程
    深入理解Linux系统调用
    基于mykernel2.0编写一个操作系统内核
    如何评测软件工程知识技能水平
    创新产品的需求分析:未来图书会是什么样子?
  • 原文地址:https://www.cnblogs.com/SHMILYHP/p/10130119.html
Copyright © 2011-2022 走看看