Redis作为高性能的键值存储系统,提供了丰富的统计命令用于监控数据状态、分析性能指标及辅助业务决策,这些命令覆盖了键值统计、数据结构统计、服务器状态统计等多个维度,能够帮助开发者实时掌握系统运行情况,以下从不同类别详细解析Redis统计命令的功能、用法及注意事项。

键值统计命令
键值统计命令主要用于分析数据库中键的分布、存活状态及访问情况,是日常运维中最常用的统计工具。
KEYS pattern
- 功能:遍历数据库中所有匹配指定模式的键。
- 示例:
KEYS user:*
返回所有以“user:”开头的键。 - 注意事项:该命令会阻塞Redis线程,在生产环境中应避免使用,尤其是数据量大时,建议改用
SCAN
命令分批遍历。
COUNT
- 功能:返回当前数据库中键的总数。
- 示例:
DBSIZE
直接返回键的数量,时间复杂度O(1),适合高频调用。 - 扩展:通过
SELECT
切换数据库后,DBSIZE
会统计当前选中数据库的键数量。
EXISTS key [key ...]
- 功能:判断一个或多个键是否存在,返回存在的键数量。
- 示例:
EXISTS key1 key2
,若两个键都存在则返回2,仅一个存在则返回1。 - 应用场景:批量检查键的有效性,避免后续操作报错。
TTL key
与 PTTL key
- 功能:返回键的剩余生存时间(TTL单位为秒,PTTL单位为毫秒),若键未设置过期时间则返回-1,键不存在则返回-2。
- 示例:
TTL session:123
,若返回300表示剩余5分钟过期。 - 关联命令:
EXPIRE key seconds
、PEXPIRE key milliseconds
用于设置过期时间,统计时需结合使用。
数据结构统计命令
Redis支持多种数据结构(字符串、哈希、列表、集合、有序集合等),针对不同结构提供了专属统计命令。
字符串(String)统计
STRLEN key
:返回字符串值的长度,若键不存在则返回0。- 应用:统计缓存内容的字符数,例如分析用户签名字段长度。
哈希(Hash)统计
HLEN key
:返回哈希表中字段的数量。HVALS key
:获取哈希表中所有值,可通过后续程序计算值的数量或特征。- 示例:
HLEN user:1001
统计用户信息的字段数量(如name、age、email等)。
列表(List)统计
LLEN key
:返回列表的长度,若列表不存在则返回0。- 应用:统计消息队列中的待处理任务数量,例如
LLEN queue:tasks
。
集合(Set)统计
SCARD key
:返回集合中元素的数量。SMEMBERS key
:获取集合中所有元素,可用于去重后的数量统计。- 示例:
SCARD online_users
统计在线用户数量(集合自动去重)。
有序集合(ZSet)统计
ZCARD key
:返回有序集合的元素数量。ZCOUNT key min max
:返回分数在指定范围内的元素数量。- 示例:
ZCOUNT leaderboard 80 100
统计分数在80-100之间的玩家数量。
服务器状态统计命令
服务器状态命令用于监控Redis实例的运行状态,包括内存使用、连接数、命令执行情况等,是性能优化的关键依据。
INFO
- 功能:返回Redis服务器的详细状态信息,可按模块分类输出。
- 常用分类:
INFO memory
:内存使用统计(如used_memory、used_memory_peak)。INFO cpu
:CPU使用情况(如used_cpu_sys、used_cpu_user)。INFO stats
:通用统计(如total_commands_processed、connected_clients)。
- 示例:
INFO memory | grep used_memory
提取内存使用量。
CONFIG GET parameter
- 功能:获取Redis配置参数的值,辅助统计配置相关的状态。
- 示例:
CONFIG GET maxmemory
查看最大内存限制配置。
CLIENT LIST
- 功能:列出当前所有连接的客户端信息,包括IP、端口、连接时长等。
- 应用:统计活跃连接数,分析异常连接(如长时间空闲的连接)。
SLOWLOG get [n]
- 功能:获取慢查询日志,统计执行时间超过阈值的命令(默认阈值10ms)。
- 示例:
SLOWLOG GET 5
返回最近5条慢查询,分析性能瓶颈。
高级统计命令
针对复杂场景,Redis还提供了一些高级统计命令,如位图统计、HyperLogLog统计等,适用于海量数据的去重与计数。

位图(Bitmap)统计
BITCOUNT key [start end]
:统计位图中值为1的位数。- 应用:统计用户活跃天数(如按天记录用户登录状态,通过
BITCOUNT
计算活跃天数)。 - 示例:
BITCOUNT user:login:2023
统计2023年用户登录天数。
HyperLogLog统计
PFCOUNT key [key ...]
:返回HyperLogLog的基数估算值(误差率约0.81%)。- 应用:海量数据去重统计,如统计独立访客数(UV)。
- 示例:
PFCOUNT page:uv:home
统计首页独立访客数。
地理空间(Geo)统计
GEOLENGTH key
:返回地理空间索引中成员的数量(需Redis 6.2+)。- 应用:统计附近的人或地点数量。
统计命令的性能与注意事项
使用统计命令时需关注其对性能的影响,避免因统计操作导致Redis阻塞:
- 避免全表扫描:如
KEYS
、SMEMBERS
(大集合)等命令,会阻塞线程,生产环境应改用SCAN
、SSCAN
等非阻塞命令。 - 控制调用频率:
INFO
、SLOWLOG
等命令虽不阻塞,但高频调用可能消耗CPU资源,建议间隔调用(如每5秒一次)。 - 合理使用数据结构:针对统计场景选择合适的数据结构,例如用HyperLogLog替代集合统计去重数量,用位图替代整数存储状态,可大幅节省内存。
相关问答FAQs
问题1:如何实时统计Redis中某类键的数量?
解答:可通过SCAN
命令分批遍历匹配的键,结合计数程序实现,例如使用Python脚本:
import redis r = redis.Redis() count = 0 cursor = 0 while True: cursor, keys = r.scan(cursor, match="user:*") count += len(keys) if cursor == 0: break print(f"匹配的键数量: {count}")
此方法避免KEYS
阻塞,适合生产环境。
问题2:INFO memory
中的used_memory
和used_memory_peak
有什么区别?如何判断内存是否超标?
解答:
used_memory
:Redis当前使用的内存量(包括数据、缓冲区等)。used_memory_peak
:Redis启动以来的内存使用峰值。
判断标准:若used_memory
接近CONFIG GET maxmemory
的值(如超过80%),需警惕内存溢出;若used_memory_peak
远高于used_memory
,说明历史存在内存使用高峰,需分析是否有临时任务导致内存激增,建议结合used_memory_rss
(操作系统分配的内存)判断是否有内存碎片,若used_memory_rss / used_memory > 1.5
,说明碎片严重,需执行MEMORY PURGE
清理。