java中文章的阅读数统计
程序员文章站
2022-07-12 13:58:52
...
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设计要求:唯一性 可读性 灵活性 时效性
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即可
上一篇: HyperLogLog--统计用户访问量
下一篇: Dubbo+Spring定时器