一、最简单常用方案:String + INCR / INCRBY
核心思路
使用 Redis 的 String 类型 存储计数,通过原子自增命令 INCR 实现高并发下的准确计数。
实现步骤
-
定义 Key,例如:
- 总访问量:
visit:total - 每日 UV:
visit:uv:2025-01-01 - 接口访问量:
api:user:list:count
- 总访问量:
-
每次访问执行:
redisINCR visit:total -
获取访问量:
redisGET visit:total
优点
- 原子操作,高并发下不会出现计数错乱
- 性能极高,单实例可达 10w QPS
- 实现最简单
二、按时间维度统计(日/周/月)
示例:每日访问量
redis
INCR visit:daily:2025-12-30
配合 过期时间 自动清理历史数据:
redis
EXPIRE visit:daily:2025-12-30 864000
三、高并发场景优化
1. 批量累加 INCRBY
先在本地合并计数,批量写入 Redis,减少 IO:
redis
INCRBY visit:total 100
2. 本地计数器 + 异步刷盘
本地计数 → 定时任务批量写入 Redis,进一步降低 Redis 压力。
四、如果需要去重统计(UV)
不能用 INCR,要用:
-
HyperLogLog(省内存,允许极小误差)
redisPFADD uv:2025-12-30 user123 PFCOUNT uv:2025-12-30 -
Set(精确去重,占内存)
redisSADD uv:set user123 SCARD uv:set
五、面试标准答案(精简背诵版)
Redis 实现访问量计数主要使用 String 类型 + INCR 原子自增命令 ,可以保证高并发下计数准确且性能极高。
按需求可分为:
- 简单计数:直接 INCR 累加
- 时间维度统计:按天/周/月生成不同 key
- UV 去重:使用 HyperLogLog 或 Set
- 高并发优化:批量 INCRBY 或本地合并后异步写入