Java 如何记录pv
记录 PV(页面访问量)的方法
在 Java 中记录 PV(Page View)可以通过多种方式实现,具体取决于应用场景和技术栈。以下是几种常见的方法:
使用 Servlet 过滤器
通过实现 javax.servlet.Filter 接口,可以在请求到达 Servlet 之前拦截并记录 PV。示例代码如下:
public class PvFilter implements Filter {
private AtomicLong pvCounter = new AtomicLong(0);
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
pvCounter.incrementAndGet();
chain.doFilter(request, response);
}
public long getPvCount() {
return pvCounter.get();
}
}
在 web.xml 中配置过滤器:

<filter>
<filter-name>PvFilter</filter-name>
<filter-class>com.example.PvFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PvFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
使用 Spring AOP
在 Spring 应用中,可以通过 AOP 切面记录 PV。示例代码如下:
@Aspect
@Component
public class PvAspect {
private AtomicLong pvCounter = new AtomicLong(0);
@Pointcut("execution(* com.example.controller.*.*(..))")
public void controllerMethods() {}
@Before("controllerMethods()")
public void recordPv() {
pvCounter.incrementAndGet();
}
public long getPvCount() {
return pvCounter.get();
}
}
使用数据库存储
将 PV 数据持久化到数据库中,可以通过 JDBC 或 JPA 实现。以下是使用 JPA 的示例:

@Entity
public class PageView {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String pageUrl;
private LocalDateTime accessTime;
// Getters and setters
}
@Repository
public interface PageViewRepository extends JpaRepository<PageView, Long> {
long countByPageUrl(String pageUrl);
}
@Service
public class PvService {
@Autowired
private PageViewRepository repository;
public void recordPv(String pageUrl) {
PageView pv = new PageView();
pv.setPageUrl(pageUrl);
pv.setAccessTime(LocalDateTime.now());
repository.save(pv);
}
public long getPvCount(String pageUrl) {
return repository.countByPageUrl(pageUrl);
}
}
使用 Redis 缓存
对于高并发的场景,可以使用 Redis 记录 PV,避免频繁操作数据库。示例代码如下:
@Service
public class RedisPvService {
@Autowired
private RedisTemplate<String, String> redisTemplate;
public void incrementPv(String pageUrl) {
redisTemplate.opsForValue().increment("pv:" + pageUrl);
}
public long getPvCount(String pageUrl) {
String count = redisTemplate.opsForValue().get("pv:" + pageUrl);
return count != null ? Long.parseLong(count) : 0;
}
}
使用第三方统计工具
集成第三方统计工具(如 Google Analytics)也是一种常见方式。可以通过 HTTP 请求将数据发送到统计平台。示例代码如下:
public class GoogleAnalyticsClient {
public void sendPvData(String pageUrl) {
String url = "https://www.google-analytics.com/collect" +
"?v=1" +
"&tid=UA-XXXXX-Y" +
"&cid=555" +
"&t=pageview" +
"&dp=" + URLEncoder.encode(pageUrl, StandardCharsets.UTF_8);
// 使用 HttpClient 发送请求
}
}
总结
根据应用场景选择合适的 PV 记录方式:
- 简单应用:Servlet 过滤器或 Spring AOP。
- 需要持久化:数据库存储。
- 高并发场景:Redis 缓存。
- 专业统计需求:第三方工具集成。




