结论与教程:使用Redis的HyperLogLog结构实现用户访问统计,避免数据丢失采用AOF+RDB持久化双机制,性能优化通过Pipeline批量操作和连接池减少查询延迟。代码示例:统计UV用HLL.INCRBY user:uv:2023-10-01 1;持久化配置appendonly yes save 900 1;延迟优化pipeline.exec()批量提交。
CSDN博客
Redis作为内存数据库,广泛用于用户访问统计。采用HyperLogLog(HLL)数据结构,只需O(1)空间估算基数,非常适合UV/PV统计。命令:PFADD key element [element ...] 返回估算基数PFCOUNT key [key ...]。实际案例中,日活用户统计误差控制在1%以内,远优于MySQL全量去重。
知乎专栏
数据丢失痛点:默认RDB快照可能丢失最近数据,建议开启AOF日志,配置appendfsync everysec,每秒fsync一次,最大丢失1秒数据。混合持久化:Redis 4.0后bgrewriteaof用RDB格式重写AOF,启动更快。测试显示,AOF+RDB恢复时间缩短80%。
掘金文章
查询延迟高因网络RTT,解决方案:1.连接池管理,避免频繁create连接;2.Pipeline管道化命令,一次网络往返执行多命令;3.本地缓存热点数据到本地Map。基准测试:单命令QPS 10w,Pipeline后提升至80w,延迟降至1ms。
博客园
用户访问统计场景:String存PV(INCR),Hash存用户明细(HSET),HLL存UV。为防内存爆炸,设置key过期TTL,结合Lua脚本原子更新:local uv = redis.call('pfcount', KEYS[1]); redis.call('pfadd', KEYS[1], ARGV[1]);。数据丢失用Sentinel高可用,主从异步复制+自动故障转移。
阿里云开发者社区
性能优化技巧:1.避免大key,单key值不超过10MB;2.内存淘汰策略allkeys-lru;3.慢查询监控slowlog get 10。用户访问日志用List LPUSH,配合LRANGE分页查询。实际优化后,QPS从5k升至50k,延迟99分位从200ms降至20ms。
腾讯云文档
解决查询延迟:使用SCAN渐进式迭代代替KEYS *;Pub/Sub解耦访问统计,上报事件异步处理;读写分离,主节点写从节点读。数据丢失预防:多副本RDB,AOF多日志合并。案例:电商平台日访问1亿PV,Redis统计零丢失。
FAQ
Q: HyperLogLog误差有多大?
A: 标准误差0.81%,实际业务可接受。
Q: AOF和RDB哪个更好?
A: 结合用,RDB快照全量,AOF增量日志。
Q: Pipeline怎么用Java?
A: Jedis pipeline = jedis.pipelined(); pipeline.incr("key"); List result = pipeline.exec();
Q: 怎么监控Redis性能?
A: INFO command,关注used_memory、connected_clients、instantaneous_ops_per_sec。