在Java中使用Redis和RedisTemplate来统计当日访问量和访问人数(UV)是一个常见的需求。下面我将提供一个完整的实现方案。
1. 设计思路
• **访问量(PV)**:使用Redis的INCR命令统计总访问次数
• **访问人数(UV)**:使用Redis的HyperLogLog数据结构统计独立访客数
• 过期时间:设置当日24点自动过期
2. 实现代码
1 | import org.springframework.data.redis.core.RedisTemplate; |
3. 使用示例
1 |
|
4. 设计说明
PV统计:
• 使用简单的计数器(INCR命令)
• 每个访问请求调用一次INCR
• 键格式:stat:pv:yyyy-MM-dd
UV统计:
• 使用HyperLogLog数据结构
• 内存占用小(每个HyperLogLog约12KB)
• 误差率约0.81%
• 键格式:stat:uv:yyyy-MM-dd
过期时间:
• 自动计算到当天24点的剩余秒数
• 设置键的过期时间
• 避免数据无限增长扩展性:
• 可以轻松扩展为按小时、周、月统计
• 可以添加用户行为分析(如访问页面、停留时间等)
5. 性能优化
- 批量操作:如果有批量记录需求,可以使用pipeline提高性能
- 持久化:如果需要长期保存数据,可以定期将Redis数据持久化到数据库
- 分布式:此方案天然支持分布式环境
6. 注意事项
- HyperLogLog有约0.81%的误差率,如果要求精确计数,可以使用Set数据结构(但内存消耗更大)
- Redis重启可能导致数据丢失,重要数据应考虑持久化方案
- 在高并发场景下,INCR命令是原子操作,无需担心并发问题
这个实现方案简单高效,适合大多数Web应用的访问统计需求。