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;
        }
  • 相关阅读:
    Siri
    ArcSDE和Geodatabase10.1抢先版谍照介绍(3)——ArcToolbox工具和其他功能
    ‘马太’效应
    Linux琐屑下Resin JSP MySQL的布置和设置配备陈设2
    平安防御:分级防御对Linux服务器的攻击
    Linux无法解析域名的处理活动
    Ubuntu Linux Server的用户僻静后果分析
    大概要领确保确保Linux体系中SSH的安适性
    无错版Vsftpd Mysql Pam设置虚拟用户要领
    Redhat Linux AS4下的LAMP与Discuz装置1
  • 原文地址:https://www.cnblogs.com/SHMILYHP/p/10130119.html
Copyright © 2011-2022 走看看