基于Redis的用户访问量统计方案,请根据需求选择适合的配置与实现方式

文章导读
使用Redis的INCR命令实现用户访问量统计是最简单高效的方式。对于单个用户访问量,可以使用KEY为"user:visit:{userId}",通过INCR命令原子性递增计数器。代码示例:redisClient.incr('user:visit:' + userId); 对于全局访问量,使用INCR('total:visit')。为了防止缓存穿透,设置合理的过期时间如EXPIRE 86400秒。
📋 目录
  1. 方案一:单用户访问统计
  2. 方案二:按天/周统计
  3. 方案三:UV统计(唯一访问)
  4. 方案四:全局访问量与排行榜
  5. 方案五:分布式环境下的HyperLogLog
  6. 配置优化建议
A A

使用Redis的INCR命令实现用户访问量统计是最简单高效的方式。对于单个用户访问量,可以使用KEY为"user:visit:{userId}",通过INCR命令原子性递增计数器。代码示例:redisClient.incr('user:visit:' + userId); 对于全局访问量,使用INCR('total:visit')。为了防止缓存穿透,设置合理的过期时间如EXPIRE 86400秒。

方案一:单用户访问统计

针对单个用户访问次数统计,使用String类型存储计数。实现代码:StringRedisTemplate.opsForValue().increment("user:visit:" + userId); 这确保了高并发下的原子性操作,无需锁机制。适用于电商、博客等需要精确用户PV的场景。

方案二:按天/周统计

使用Hash类型,按日期分片存储,如HINCRBY 'user:visit:20231001' userId 1。每日生成新KEY,实现数据隔离。代码:redis.hincrby('daily:visit:' + today, userId, 1); 过期策略:定期清理旧KEY,或设置TTL。适合需要时间维度分析的需求。

基于Redis的用户访问量统计方案,请根据需求选择适合的配置与实现方式

方案三:UV统计(唯一访问)

使用Bitmap高效统计UV,SETBIT 'user:uv:20231001' userHash 1,其中userHash为userId的CRC32哈希。查询UV:BITCOUNT key。节省内存,1亿用户仅需12.5MB。适用于实时UV监控。

方案四:全局访问量与排行榜

结合Sorted Set实现访问排行:ZINCRBY 'visit:rank' 1 userId。查询TopN:ZREVRANGE 0 9 WITHSCORES。适用于leaderboard功能。高并发下性能优秀,每秒可处理10w+ QPS。

方案五:分布式环境下的HyperLogLog

对于超大规模UV,使用PFADD 'uv:global' userId,后PFCOUNT查询近似值,误差<1%。内存占用极低,适合亿级UV统计。代码:redis.pfadd('daily:uv', userId); 无需精确计数时优先选择。

基于Redis的用户访问量统计方案,请根据需求选择适合的配置与实现方式

配置优化建议

Redis配置:maxmemory-policy allkeys-lru,设置maxmemory 2GB。使用Pipeline批量操作减少RTT。连接池配置:maxTotal 100,maxIdle 20。监控:使用INFO stats观察命令命中率,确保>90%。

FAQ
Q: Redis访问量统计如何处理高并发?
A: 利用INCR等原子命令,无需额外锁。
Q: 如何防止统计重复?
A: 结合Session或Cookie唯一标识用户。
Q: 数据持久化怎么做?
A: 配置AOF+RDB双重持久化。
Q: 内存不足时怎么办?
A: 使用HyperLogLog或数据采样。