资讯动态

Redis INFO命令详解:核心指标与生产环境实战

发布时间:2026/10/26 4:16:22 来源:尧图企业网站定制
1. Redis INFO命令深度解析Redis作为当前最流行的内存数据库之一其内置的INFO命令是运维人员和开发者必须掌握的核心诊断工具。这个看似简单的命令实际上包含了Redis实例运行状态的完整快照从内存使用到客户端连接从持久化状态到复制关系几乎所有关键指标都能通过INFO命令一览无余。我第一次在生产环境排查性能问题时就是通过INFO命令发现的连接数异常增长。当时某个微服务没有正确释放连接导致Redis实例的连接数持续上升最终触发了maxclients限制。通过分析INFO输出中的connected_clients和blocked_clients字段我们迅速定位了问题代码。这种实战经历让我深刻认识到精通INFO命令的输出解读是Redis运维的基本功。2. INFO命令基础使用2.1 命令格式与参数在Redis-cli中执行INFO命令的基本格式如下127.0.0.1:6379 INFO [section]其中section参数是可选的用于指定要获取的信息类别。如果不带参数INFO命令会返回所有信息。Redis 7.0版本支持的主要section包括serverRedis服务器基本信息clients客户端连接相关memory内存使用情况persistenceRDB和AOF持久化状态stats通用统计信息replication主从复制信息cpuCPU使用情况commandstats命令统计latency延迟统计cluster集群信息modules模块信息keyspace数据库键统计2.2 典型使用场景在实际工作中我通常会根据不同的排查目标选择特定的section快速健康检查INFO memoryINFO stats连接数问题INFO clientsINFO stats持久化问题INFO persistence主从同步延迟INFO replication命令热点分析INFO commandstats提示生产环境中建议使用INFO all命令获取完整信息后保存到文件便于后续分析。对于大型Redis实例全量INFO输出可能达到几十KB直接阅读会比较困难。3. 核心指标详解3.1 Server基础信息INFO server部分包含了Redis实例的基础信息这些字段在版本兼容性和问题诊断中特别重要# Server redis_version:7.0.5 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:9a3b086f4c0d4d1a redis_mode:standalone os:Linux 5.4.0-105-generic x86_64 arch_bits:64 multiplexing_api:epoll atomicvar_api:atomic-builtin gcc_version:9.3.0 process_id:1 run_id:7f3a3c2d9e9d4a1b8c0d5f6e7a8b9c0d tcp_port:6379 server_time_usec:1659345678901234 uptime_in_seconds:86400 uptime_in_days:1 hz:10 configured_hz:10 lru_clock:1234567 executable:/usr/local/bin/redis-server config_file:/etc/redis/redis.conf io_threads_active:0关键字段解析redis_version不仅显示版本号还能帮助判断是否存在已知漏洞os操作系统信息某些性能问题与OS版本相关uptime_in_seconds实例运行时间短时间内的重启可能暗示存在问题hzRedis内部定时任务频率影响过期键清除和超时检查的及时性io_threads_activeI/O线程数0表示未启用多线程3.2 内存使用分析INFO memory是排查内存问题的第一站其输出包含内存分配和使用细节# Memory used_memory:104857600 used_memory_human:100.00M used_memory_rss:110100480 used_memory_rss_human:105.00M used_memory_peak:120586240 used_memory_peak_human:115.00M used_memory_peak_perc:86.90% used_memory_overhead:20971520 used_memory_startup:862208 used_memory_dataset:83886080 used_memory_dataset_perc:80.00% allocator_allocated:104857600 allocator_active:110100480 allocator_resident:115343360 total_system_memory:17179869184 total_system_memory_human:16.00G used_memory_lua:37888 used_memory_lua_human:37.00K used_memory_scripts:0 used_memory_scripts_human:0B number_of_cached_scripts:0 maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction allocator_frag_ratio:1.05 allocator_frag_bytes:5242880 allocator_rss_ratio:1.05 allocator_rss_bytes:5242880 rss_overhead_ratio:0.96 rss_overhead_bytes:-5242880 mem_fragmentation_ratio:1.05 mem_fragmentation_bytes:5242880 mem_not_counted_for_evict:0 mem_replication_backlog:1048576 mem_clients_slaves:0 mem_clients_normal:49600 mem_aof_buffer:0 mem_allocator:jemalloc-5.1.0 active_defrag_running:0 lazyfree_pending_objects:0内存相关的重要指标used_memory vs used_memory_rssused_memoryRedis分配器申请的内存总量used_memory_rss操作系统看到的内存占用两者比值mem_fragmentation_ratio大于1.5时可能存在内存碎片内存使用趋势# 计算内存增长速率 redis-cli --latency-history -i 60 \ | awk /used_memory:/{print $2} \ | paste -sd- \ | bc内存淘汰策略maxmemory_policy决定了内存达到上限时的行为常见策略有volatile-lru、allkeys-lru、volatile-ttl等经验当mem_fragmentation_ratio持续高于1.5时可以考虑重启实例或启用active defragmentation需要Redis 4.03.3 客户端连接监控INFO clients展示了客户端连接状态对于诊断连接泄漏和拒绝服务攻击至关重要# Clients connected_clients:50 cluster_connections:0 maxclients:10000 client_recent_max_input_buffer:8 client_recent_max_output_buffer:0 blocked_clients:0 tracking_clients:0 clients_in_timeout_table:0关键指标说明connected_clients当前客户端连接数maxclients允许的最大连接数受限于ulimit和maxclients配置blocked_clients因BLPOP等命令阻塞的客户端数client_recent_max_input_buffer最近最大的输入缓冲区大小KB连接数突增的常见原因客户端连接池配置不当未设置最大连接数客户端未正确释放连接遭受连接型攻击检查连接来源的命令redis-cli client list | awk {print $2} | cut -d -f2 | sort | uniq -c | sort -nr3.4 持久化状态检查INFO persistence展示了RDB和AOF持久化的状态对于数据安全至关重要# Persistence loading:0 rdb_changes_since_last_save:1000 rdb_bgsave_in_progress:0 rdb_last_save_time:1659345600 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:1 rdb_current_bgsave_time_sec:-1 rdb_last_cow_size:4194304 aof_enabled:1 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok aof_last_cow_size:0 aof_current_size:123456 aof_base_size:123000 aof_pending_rewrite:0 aof_buffer_length:0 aof_rewrite_buffer_length:0 aof_pending_bio_fsync:0 aof_delayed_fsync:0关键状态解读RDB相关rdb_bgsave_in_progress是否正在执行BGSAVErdb_last_bgsave_status上次BGSAVE状态ok/errrdb_last_save_time上次成功保存的Unix时间戳AOF相关aof_rewrite_in_progress是否正在执行AOF重写aof_last_rewrite_status上次AOF重写状态aof_current_size当前AOF文件大小警告如果aof_last_write_status或rdb_last_bgsave_status显示err表明持久化失败必须立即检查Redis日志和磁盘空间3.5 复制状态监控INFO replication对于主从架构至关重要可以实时了解复制状态和延迟# Replication role:master connected_slaves:2 slave0:ip192.168.1.2,port6379,stateonline,offset10000,lag0 slave1:ip192.168.1.3,port6379,stateonline,offset9500,lag1 master_failover_state:no-failover master_replid:7f3a3c2d9e9d4a1b8c0d5f6e7a8b9c0d master_replid2:0000000000000000000000000000000000000000 master_repl_offset:10000 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:10000主从复制关键指标角色识别role:master或role:slave从节点还会显示master_host和master_port复制延迟offset差值反映主从数据差异lag表示从节点最后一次ping的秒数复制积压缓冲区repl_backlog_size缓冲区大小repl_backlog_histlen当前有效数据量检测复制延迟的实用命令# 主节点获取当前偏移量 MASTER_OFFSET$(redis-cli info replication | grep master_repl_offset | cut -d: -f2) # 从节点获取自身偏移量 SLAVE_OFFSET$(redis-cli info replication | grep slave_repl_offset | cut -d: -f2) # 计算延迟字节数 echo $(($MASTER_OFFSET - $SLAVE_OFFSET))4. 高级应用场景4.1 性能基准测试结合INFO stats可以实施简单的性能测试# 测试前重置统计 redis-cli config resetstat # 执行测试命令 redis-benchmark -q -n 100000 # 查看命令统计 redis-cli info commandstats4.2 内存优化分析通过INFO memory和INFO keyspace可以分析内存使用模式# 获取各数据库键数量 redis-cli info keyspace # 获取大键列表 redis-cli --bigkeys # 获取内存分析报告 redis-cli --memkeys4.3 监控集成方案将INFO命令集成到监控系统中的常用方法Telegraf采集[[inputs.redis]] servers [tcp://localhost:6379] password yourpasswordPrometheus监控- job_name: redis static_configs: - targets: [localhost:9121] metrics_path: /scrape params: target: [redis://localhost:6379]自定义采集脚本#!/bin/bash HOSTlocalhost PORT6379 METRICS_FILE/tmp/redis_metrics.prom echo # HELP redis_connected_clients Connected clients $METRICS_FILE echo # TYPE redis_connected_clients gauge $METRICS_FILE echo redis_connected_clients $(redis-cli -h $HOST -p $PORT info clients | grep connected_clients | cut -d: -f2) $METRICS_FILE5. 常见问题排查指南5.1 内存不足错误现象OOM command not allowed when used memory maxmemory排查步骤检查INFO memory中的used_memory和maxmemory确认maxmemory_policy设置分析INFO keyspace中的键数量分布使用redis-cli --bigkeys找出大键5.2 连接数耗尽现象max number of clients reached解决方案临时增加连接数限制redis-cli config set maxclients 20000检查INFO clients中的连接来源redis-cli client list | awk {print $2} | cut -d -f2 | sort | uniq -c优化客户端连接池配置5.3 主从同步延迟现象从节点数据落后主节点诊断方法主节点执行redis-cli info replication | grep master_repl_offset从节点执行redis-cli info replication | grep slave_repl_offset计算偏移量差值优化建议增大repl-backlog-size提升从节点性能考虑使用更快的网络连接5.4 AOF写入阻塞现象Redis响应变慢aof_delayed_fsync增加解决方案检查磁盘IO性能iostat -x 1调整AOF策略# 将everysec改为no牺牲部分持久性换取性能 redis-cli config set appendfsync no升级硬件或使用更快的存储设备6. 实用技巧与最佳实践6.1 INFO命令自动化分析创建定期收集和分析INFO输出的脚本#!/bin/bash REDIS_HOSTlocalhost REDIS_PORT6379 LOG_DIR/var/log/redis # 收集全量INFO输出 TIMESTAMP$(date %Y%m%d_%H%M%S) redis-cli -h $REDIS_HOST -p $REDIS_PORT info all $LOG_DIR/redis_info_$TIMESTAMP.log # 提取关键指标生成报告 { echo Redis Health Report echo Timestamp: $(date) echo Uptime: $(redis-cli -h $REDIS_HOST -p $REDIS_PORT info | grep uptime_in_days | cut -d: -f2) days echo Memory Usage: $(redis-cli -h $REDIS_HOST -p $REDIS_PORT info memory | grep used_memory_human | cut -d: -f2) echo Clients: $(redis-cli -h $REDIS_HOST -p $REDIS_PORT info clients | grep connected_clients | cut -d: -f2)/$(redis-cli -h $REDIS_HOST -p $REDIS_PORT info clients | grep maxclients | cut -d: -f2) echo Memory Fragmentation Ratio: $(redis-cli -h $REDIS_HOST -p $REDIS_PORT info memory | grep mem_fragmentation_ratio | cut -d: -f2) } $LOG_DIR/redis_report_$TIMESTAMP.txt6.2 关键指标监控告警建议对以下指标设置告警阈值指标名称警告阈值严重阈值检查命令内存使用率70%90%used_memory/maxmemory内存碎片率1.31.8mem_fragmentation_ratio连接数使用率70%90%connected_clients/maxclients持久化最后一次成功状态-!okrdb_last_bgsave_status主从复制延迟(字节)10MB100MBmaster_repl_offset-slave_repl_offset6.3 性能优化建议内存优化使用Hash类型代替多个String键启用压缩选项list-max-ziplist-entries等定期执行MEMORY PURGE使用jemalloc时持久化调优对于大内存实例增加rdb-save-incremental-fsync调整AOF重写触发条件auto-aof-rewrite-percentage/min-size网络优化适当增加tcp-backlog考虑启用repl-disable-tcp-nodelay高延迟网络6.4 安全加固建议定期检查INFO clients中的异常连接监控INFO commandstats中的命令调用频率限制危险命令的使用# 重命名危险命令 rename-command FLUSHDB FLUSHDB_MUST_AUTH rename-command CONFIG CONFIG_MUST_AUTH检查INFO persistence确保持久化正常工作7. 版本差异与兼容性不同Redis版本的INFO输出有所差异以下是主要变化版本新增字段移除字段6.0io_threads_active, total_system_memory-6.2mem_allocator, active_defrag_running-7.0aof_rewrite_buffer_length, rdb_last_cow_size-在编写监控脚本时应该考虑版本兼容性问题。可以通过以下方式处理# 检查版本并条件获取指标 VERSION$(redis-cli info server | grep redis_version | cut -d: -f2) if [[ $VERSION ~ ^7 ]]; then # Redis 7.x特有指标 THREADS$(redis-cli info server | grep io_threads_active | cut -d: -f2) else # 旧版本处理 THREADS1 fi8. 第三方工具推荐RedisInsight官方可视化工具提供INFO数据的图形化展示redis-stat命令行监控工具实时显示关键指标Prometheus Redis Exporter将Redis指标导出为Prometheus格式Grafana Redis Dashboard基于INFO数据的可视化面板安装RedisInsight的简单方法docker run -d --name redisinsight -p 8001:8001 redislabs/redisinsight:latest9. 生产环境实战案例9.1 内存泄漏排查现象Redis内存使用持续增长但键数量没有明显增加排查过程检查INFO memory发现used_memory_rss增长快于used_memory观察mem_fragmentation_ratio持续高于1.7使用MEMORY MALLOC-STATS查看内存分配详情发现大量小对象分配导致内存碎片解决方案升级到Redis 4.0启用主动碎片整理config set activedefrag yes调整jemalloc参数减少碎片优化客户端代码减少小对象存储9.2 性能抖动分析现象Redis偶尔出现响应延迟排查过程检查INFO commandstats发现某些命令执行时间异常分析INFO persistence发现AOF重写期间出现延迟检查INFO cpu发现sys CPU使用率偏高最终定位到磁盘IO瓶颈解决方案将AOF文件放在单独的高性能磁盘上调整AOF重写触发条件升级服务器使用SSD存储10. 总结与进阶建议掌握INFO命令的完整解读是Redis运维的基础技能但真正的专业级应用还需要结合SLOWLOG分析性能瓶颈使用MONITOR命令实时观察请求模式谨慎使用影响性能定期分析INFO commandstats识别热点命令建立完整的监控体系包括基础资源监控CPU、内存、网络Redis内部指标监控业务层面监控如缓存命中率最后分享一个实用技巧在分析生产环境问题时可以先用redis-cli --stat获取实时统计信息快速判断系统负载情况。这个命令实际上是基于INFO命令的持续输出但提供了更直观的交互式界面。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑