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设计要求:唯一性  可读性  灵活性  时效性

在这里插入图片描述

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即可
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要根据IP统计文章浏览,需要在Java web应用使用Servlet技术和数据库技术。 以下是一个简单的示例: 1. 在MySQL数据库创建一张表,用于存储文章的浏览统计信息。表结构如下: ```sql CREATE TABLE article_view_count ( article_id INT NOT NULL, ip VARCHAR(15) NOT NULL, view_count INT DEFAULT 0, PRIMARY KEY (article_id, ip) ); ``` 2. 在Java web项目编写一个Servlet,用于处理文章浏览请求。在Servlet,可以通过request对象获取客户端的IP地址,并将IP地址和文章ID存入数据库。代码示例: ```java @WebServlet("/article") public class ArticleServlet extends HttpServlet { private static final String DB_URL = "jdbc:mysql://localhost:3306/mydb"; private static final String DB_USER = "root"; private static final String DB_PASSWORD = "password"; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取文章ID int articleId = Integer.parseInt(request.getParameter("id")); // 获取客户端IP String ip = request.getRemoteAddr(); // 将IP和文章ID存入数据库 try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { // 查询是否已经存在该IP对应的浏览记录 PreparedStatement ps = conn.prepareStatement( "SELECT * FROM article_view_count WHERE article_id = ? AND ip = ?"); ps.setInt(1, articleId); ps.setString(2, ip); ResultSet rs = ps.executeQuery(); if (rs.next()) { // 如果已经存在该IP对应的浏览记录,则更新浏览次数 int viewCount = rs.getInt("view_count") + 1; ps = conn.prepareStatement( "UPDATE article_view_count SET view_count = ? WHERE article_id = ? AND ip = ?"); ps.setInt(1, viewCount); ps.setInt(2, articleId); ps.setString(3, ip); ps.executeUpdate(); } else { // 如果不存在该IP对应的浏览记录,则插入新的记录 ps = conn.prepareStatement( "INSERT INTO article_view_count (article_id, ip, view_count) VALUES (?, ?, 1)"); ps.setInt(1, articleId); ps.setString(2, ip); ps.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } // 返回文章内容 // ... } } ``` 3. 在文章页面调用上述Servlet,获取文章浏览的信息,并显示在页面上。代码示例: ```java <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.sql.*,java.util.*" %> <% int articleId = Integer.parseInt(request.getParameter("id")); String ip = request.getRemoteAddr(); // 查询文章浏览 int viewCount = 0; try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) { PreparedStatement ps = conn.prepareStatement( "SELECT SUM(view_count) AS total_view_count FROM article_view_count WHERE article_id = ?"); ps.setInt(1, articleId); ResultSet rs = ps.executeQuery(); if (rs.next()) { viewCount = rs.getInt("total_view_count"); } } catch (SQLException e) { e.printStackTrace(); } %> <html> <head> <title>文章页面</title> </head> <body> <h1>文章标题</h1> <p>浏览: <%= viewCount %></p> <p>文章内容...</p> </body> </html> ``` 这样,每当有用户访问文章页面时,就会根据IP地址统计文章的浏览,并将统计信息存入数据库。在文章页面,可以通过查询数据库获取文章的总浏览,并显示在页面上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值