java中文章的阅读数统计

本文探讨在高并发场景下,如何优化Java应用中的文章阅读数统计。通过对比直接数据库操作与使用缓存的方式,详细介绍了利用Redis缓存技术来减轻数据库压力的方法。包括Redis缓存的key设计原则、VO对象的实现,以及具体的缓存操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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即可
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值