java中文章的阅读数统计
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9d831513d7d4cd15fc6c2d4d969838a0.png)
1.直接操作数据库进行增加操作存在问题
存在问题:
每次请求都要update数据库,如果访问量大了之后,数据库存在操作压力,此时怎么办?
解决方法:
1.提高数据库性能(横向/纵向拓展)
2.使用缓存方式减轻数据压力
推荐使用缓存方式:
优点:操作快捷,可以减轻数据访问压力
缺点:数据可能丢失
-----------------------------------------------------------------------------------
注意:缓存能操作数据必须是非敏感数据(不是很重要的数据)
2.实现缓存的技术
1.jdk的自带集合(比如:map)
最大弊端:数据存在内存中,一旦断电数据丢失
2.ehcache 纯的java的进程内缓存框架
最大弊端:ehcache缓存面向的是单体结构项目
单体:项目1,项目2
多体:分布式项目/微服务项目
3.redis /memcache 一套分布式的高速缓存系统
redis缓存可以针对单体,也可以针对分布式或微服务项目,并且操作性能非常高
---------------------------------------------------------------------------------
确定redis作为缓存技术,接下来思考的点:
该如何操作redis,而redis操作无非是:key怎么设计,value怎么设计
key设计要求:唯一性 可读性 灵活性 时效性
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/4622def7f94e4ca70968d497ed8cbe65.png)
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;
private int viewnum;
private int replynum;
private int favornum;
private int sharenum;
private int thumbsupnum;
}
5.具体实现
@Override
public void viewnumIncrease(String sid, int num) {
StrategyStatisVO statisVO = this.getStrategyStatisVO(sid);
statisVO.setViewnum(statisVO.getViewnum() + num);
this.setStrategyStatisVO(statisVO);
}
@Override
public StrategyStatisVO getStrategyStatisVO(String sid) {
String key = RedisKeys.STRATEGY_STATIS_VO.join(sid);
StrategyStatisVO statisVO = new StrategyStatisVO();
if (!template.hasKey(key)) {
Strategy strategy = strategyService.get(sid);
BeanUtils.copyProperties(strategy, statisVO);
statisVO.setStrategyId(sid);
template.opsForValue().set(key, JSON.toJSONString(statisVO));
} else {
String VO = template.opsForValue().get(key);
statisVO = JSON.parseObject(VO, StrategyStatisVO.class);
}
return statisVO;
}
@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即可