欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java中文章的阅读数统计

程序员文章站 2022-07-12 13:58:52
...

java中文章的阅读数统计

java中文章的阅读数统计

1.直接操作数据库进行增加操作存在问题
存在问题:
	每次请求都要update数据库,如果访问量大了之后,数据库存在操作压力,此时怎么办?
解决方法:
	1.提高数据库性能(横向/纵向拓展)
    2.使用缓存方式减轻数据压力
推荐使用缓存方式:
	优点:操作快捷,可以减轻数据访问压力
	缺点:数据可能丢失
-----------------------------------------------------------------------------------
注意:缓存能操作数据必须是非敏感数据(不是很重要的数据)
2.实现缓存的技术
	1.jdk的自带集合(比如:map)
       最大弊端:数据存在内存中,一旦断电数据丢失
    2.ehcache 纯的java的进程内缓存框架
       最大弊端:ehcache缓存面向的是单体结构项目
          单体:项目1,项目2
          多体:分布式项目/微服务项目       
    3.redis /memcache 一套分布式的高速缓存系统
    	redis缓存可以针对单体,也可以针对分布式或微服务项目,并且操作性能非常高
 ---------------------------------------------------------------------------------
确定redis作为缓存技术,接下来思考的点:
该如何操作redis,而redis操作无非是:key怎么设计,value怎么设计
key设计要求:唯一性  可读性  灵活性  时效性

java中文章的阅读数统计

3.步骤
流程实现:
	1.请求进入到攻略明细接口,获取访问的攻略sid
	2.通过sid拼接出攻略统计vo对象在redis中key strategy_statis_vo:sid
	3.判断vo对象的key是否存在
	4.如果不存在, 需要初始化vo对象进入redis中
		1>从数据库中查询出攻略的5个条件数据
		2>将添加数据复制给vo对象
		3>缓存到redis中
	5.如果已经存在,或者已经初始化好了,通过key获取vo对象
	6.统一设置阅读数viewnum属性+1
    7.更新vo对象
4.vo对象
@Getter
@Setter
public class StrategyStatisVO implements Serializable {
    private String strategyId;  //攻略id
    private int viewnum;  //点击数
    private int replynum;  //攻略评论数
    private int favornum; //收藏数
    private int sharenum; //分享数
    private int thumbsupnum; //点赞个数
}
5.具体实现
     //设置阅读数
    @Override
    public void viewnumIncrease(String sid, int num) {
        //使用枚举类拼接key,获取vo对象
        StrategyStatisVO statisVO = this.getStrategyStatisVO(sid);
        //阅读数统一加一
        statisVO.setViewnum(statisVO.getViewnum() + num);
        //更新vo
        this.setStrategyStatisVO(statisVO);
    }
	//获取vo对象
    @Override
    public StrategyStatisVO getStrategyStatisVO(String sid) {
        //使用枚举类拼接key
        String key = RedisKeys.STRATEGY_STATIS_VO.join(sid);
        StrategyStatisVO statisVO = new StrategyStatisVO();
        //判断vo对象是否存在,即判断key是否存在
        if (!template.hasKey(key)) {
            //不存在,初始化数据,将数据查出来,然后赋值给vo对象,最后存起来
            Strategy strategy = strategyService.get(sid);
            // BeanUtils工具类
            BeanUtils.copyProperties(strategy, statisVO);
            statisVO.setStrategyId(sid);
            template.opsForValue().set(key, JSON.toJSONString(statisVO));
        } else {
            //存在,获取vo对象
            String VO = template.opsForValue().get(key);
            statisVO = JSON.parseObject(VO, StrategyStatisVO.class);
        }
        return statisVO;
    }
	//更新vo对象,将vo对象保存到redis数据库中
    @Override
    public void setStrategyStatisVO(StrategyStatisVO statisVO) {
        String key = RedisKeys.STRATEGY_STATIS_VO.join(statisVO.getStrategyId());
        template.opsForValue().set(key, JSON.toJSONString(statisVO));
    }

小结

   1. 数据统计之阅读数统计,我们需要分析出使用vo对象来进行封装
   2.这样,当还有其他分享数/点赞数/收藏数等其他需要统计的数据时,我们可以只设计一个key和value 
   3.value存储vo对象,当数据发生变化时,我们只需要通过key键从redis中取出对应的vo对象,
	然后对vo对象中的属性进行crud操作,最后将更改的vo对象存到redis中即可
   4.每次刷新页面取出vo对象,然后将其中阅读属性+1即可