外观
Redis CLI 监控命令
Redis CLI 提供了丰富的监控命令,用于实时查看 Redis 实例的运行状态、性能指标、内存使用、客户端连接等信息。这些命令是 Redis 运维和故障诊断的重要工具。
常用的 Redis CLI 监控命令包括:
INFO: 获取 Redis 各种信息和统计数据MONITOR: 实时监控 Redis 命令执行SLOWLOG: 查看慢查询日志CLIENT LIST: 查看客户端连接列表MEMORY STATS: 查看内存使用详情CONFIG GET: 获取配置信息KEYS: 查找匹配的键(生产环境慎用)DBSIZE: 获取数据库键数量PING: 测试 Redis 连接
INFO 命令详解
INFO 命令是 Redis 最常用的监控命令,用于获取 Redis 实例的详细信息。它可以返回多种类型的信息,通过参数可以指定获取特定部分的信息。
基本用法
bash
# 获取所有信息
redis-cli INFO
# 获取特定部分的信息
redis-cli INFO section
# 获取多个部分的信息,用逗号分隔
redis-cli INFO section1,section2常用信息部分
- server: 服务器基本信息
- clients: 客户端连接信息
- memory: 内存使用信息
- persistence: 持久化信息
- stats: 统计信息
- replication: 复制信息
- cpu: CPU 使用信息
- commandstats: 命令统计信息
- cluster: 集群信息
- keyspace: 键空间信息
INFO server 解析
bash
redis-cli INFO server输出示例:
# Server
redis_version:7.2.5
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:abcdef1234567890
redis_mode:standalone
os:Linux 5.15.0-88-generic x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:11.4.0
process_id:1234
process_supervised:no
run_id:abc123def456ghi789jkl012mno345pqr678stu901vwx234yz
tcp_port:6379
server_time_usec:1705123456789
uptime_in_seconds:86400
uptime_in_days:1
hz:10
configured_hz:10
lru_clock:12345678
executable:/usr/local/bin/redis-server
config_file:/etc/redis/redis.conf
io_threads_active:0关键指标说明:
redis_version: Redis 版本redis_mode: 运行模式(standalone, sentinel, cluster)uptime_in_seconds: 运行时间(秒)process_id: 进程 IDconfig_file: 配置文件路径
INFO clients 解析
bash
redis-cli INFO clients输出示例:
# Clients
connected_clients:10
cluster_connections:0
maxclients:10000
client_recent_max_input_buffer:2048
client_recent_max_output_buffer:0
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0关键指标说明:
connected_clients: 当前连接的客户端数量maxclients: 最大允许的客户端数量blocked_clients: 被阻塞的客户端数量(如执行 BLPOP、BRPOP 等命令)
INFO memory 解析
bash
redis-cli INFO memory输出示例:
# Memory
used_memory:104857600
used_memory_human:100.00M
used_memory_rss:157286400
used_memory_rss_human:150.00M
used_memory_peak:209715200
used_memory_peak_human:200.00M
used_memory_peak_perc:50.00%
used_memory_overhead:10240000
used_memory_startup:10485760
used_memory_dataset:84377600
used_memory_dataset_perc:80.47%
allocator_allocated:105857600
allocator_active:122880000
allocator_resident:163840000
total_system_memory:8589934592
total_system_memory_human:8.00G
used_memory_lua:31744
used_memory_lua_human:31.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:536870912
maxmemory_human:512.00M
maxmemory_policy:allkeys-lru
allocator_frag_ratio:1.16
allocator_frag_bytes:17022400
allocator_rss_ratio:1.33
allocator_rss_bytes:40960000
rss_overhead_ratio:0.96
rss_overhead_bytes:-6553600
mem_fragmentation_ratio:1.50
mem_fragmentation_bytes:52428800
mem_not_counted_for_evict:0
mem_replication_backlog:1048576
mem_clients_slaves:0
mem_clients_normal:491520
mem_aof_buffer:0
mem_allocator:jemalloc-5.3.0
active_defrag_running:0
lazyfree_pending_objects:0
lazyfreed_objects:0关键指标说明:
used_memory: Redis 分配的内存总量(字节)used_memory_human: 人类可读的内存总量used_memory_rss: 操作系统分配给 Redis 进程的内存总量(常驻集大小)used_memory_peak: Redis 内存使用峰值maxmemory: 配置的最大内存限制maxmemory_policy: 内存淘汰策略mem_fragmentation_ratio: 内存碎片率
INFO stats 解析
bash
redis-cli INFO stats输出示例:
# Stats
total_connections_received:100
total_commands_processed:10000
instantaneous_ops_per_sec:100
total_net_input_bytes:1048576
total_net_output_bytes:10485760
instantaneous_input_kbps:10
instantaneous_output_kbps:100
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:100
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:8000
keyspace_misses:2000
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:1000
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
tracking_total_keys:0
tracking_total_items:0
tracking_total_prefixes:0
unexpected_error_replies:0
total_reads_processed:10000
total_writes_processed:10000
aio_threaded_reads_processed:0
aio_threaded_writes_processed:0关键指标说明:
total_connections_received: 总共接受的连接数total_commands_processed: 总共处理的命令数instantaneous_ops_per_sec: 每秒处理的命令数(瞬时值)keyspace_hits: 键空间命中次数keyspace_misses: 键空间未命中次数expired_keys: 过期键数量evicted_keys: 因内存不足被淘汰的键数量
INFO replication 解析
bash
redis-cli INFO replication输出示例(主节点):
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.101,port=6379,state=online,offset=10000,lag=1
slave1:ip=192.168.1.102,port=6379,state=online,offset=10000,lag=0
master_failover_state:no-failover
master_replid:abcdef1234567890abcdef1234567890abcdef12
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, slave, sentinel)connected_slaves: 连接的从节点数量slave0,slave1: 从节点详细信息,包括 IP、端口、状态、偏移量和延迟master_repl_offset: 主节点复制偏移量
MONITOR 命令
MONITOR 命令用于实时监控 Redis 命令执行,它会打印出所有发送到 Redis 服务器的命令。
基本用法
bash
# 启动监控
redis-cli MONITOR
# 监控并将输出保存到文件
redis-cli MONITOR > redis-monitor.log
# 监控指定时间(如 10 秒)
timeout 10 redis-cli MONITOR输出示例
1705123456.789 [0 127.0.0.1:54321] "PING"
1705123456.790 [0 127.0.0.1:54321] "SET" "key1" "value1"
1705123456.791 [0 127.0.0.1:54321] "GET" "key1"
1705123456.792 [0 127.0.0.1:54322] "INFO" "memory"注意事项
MONITOR命令会产生一定的性能开销,在生产环境中应谨慎使用- 建议只在故障诊断或性能分析时临时使用
- 避免长时间运行
MONITOR命令,尤其是在高并发环境
SLOWLOG 命令
SLOWLOG 命令用于查看 Redis 慢查询日志,记录执行时间超过指定阈值的命令。
慢查询配置
在 redis.conf 中配置慢查询:
txt
# 慢查询阈值(微秒),超过此值的命令会被记录
slowlog-log-slower-than 10000
# 慢查询日志最大长度
slowlog-max-len 1000基本用法
bash
# 获取慢查询日志
redis-cli SLOWLOG GET
# 获取指定数量的慢查询日志
redis-cli SLOWLOG GET <count>
# 获取慢查询日志的长度
redis-cli SLOWLOG LEN
# 重置慢查询日志
redis-cli SLOWLOG RESET输出示例
1) 1) (integer) 123
2) (integer) 1705123456
3) (integer) 20000
4) 1) "KEYS"
2) "*"
5) "127.0.0.1:54321"
6) ""
2) 1) (integer) 122
2) (integer) 1705123455
3) (integer) 15000
4) 1) "HGETALL"
2) "large_hash_key"
5) "127.0.0.1:54322"
6) ""输出字段说明:
- 慢查询日志的唯一 ID
- 命令执行的 Unix 时间戳
- 命令执行的耗时(微秒)
- 执行的命令及其参数
- 客户端 IP 和端口
- 客户端名称(如果有)
内存监控命令
MEMORY STATS
MEMORY STATS 命令用于获取 Redis 内存使用的详细统计信息。
bash
redis-cli MEMORY STATS输出示例:
1) "peak.allocated"2) (integer) 209715200
3) "total.allocated"4) (integer) 104857600
5) "startup.allocated"6) (integer) 10485760
7) "replication.backlog"8) (integer) 1048576
9) "clients.slaves"10) (integer) 0
11) "clients.normal"12) (integer) 491520
13) "aof.buffer"14) (integer) 0
15) "db.0"16) 1) "overhead.hashtable.main"2) (integer) 8192
2) "overhead.hashtable.expires"3) (integer) 0
17) "overhead.total"18) (integer) 10240000
19) "keys.count"20) (integer) 10000
21) "keys.bytes-per-key"22) (integer) 8438
23) "dataset.bytes"24) (integer) 84377600
25) "dataset.percentage"26) "80.47"
27) "peak.percentage"28) "50.00"
29) "fragmentation"30) "1.50"MEMORY USAGE
MEMORY USAGE 命令用于获取指定键的内存使用情况。
bash
redis-cli MEMORY USAGE <key>输出示例:
(integer) 48MEMORY PURGE
MEMORY PURGE 命令用于尝试释放内存碎片。
bash
redis-cli MEMORY PURGE客户端监控命令
CLIENT LIST
CLIENT LIST 命令用于查看当前连接到 Redis 服务器的客户端列表。
bash
redis-cli CLIENT LIST输出示例:
id=1 addr=127.0.0.1:54321 fd=5 name= age=10 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=2 addr=127.0.0.1:54322 fd=6 name= age=5 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=info输出字段说明:
id: 客户端 IDaddr: 客户端 IP 和端口fd: 文件描述符name: 客户端名称age: 客户端连接的时间(秒)idle: 客户端空闲时间(秒)flags: 客户端标志db: 当前数据库cmd: 最后执行的命令
CLIENT INFO
CLIENT INFO 命令用于获取当前客户端的信息。
bash
redis-cli CLIENT INFO输出示例:
id=3 addr=127.0.0.1:54323 fd=7 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=clientCLIENT KILL
CLIENT KILL 命令用于关闭指定的客户端连接。
bash
# 根据 IP 和端口关闭客户端
redis-cli CLIENT KILL <ip>:<port>
# 根据客户端 ID 关闭客户端
redis-cli CLIENT KILL ID <id>
# 关闭所有空闲时间超过指定秒数的客户端
redis-cli CLIENT KILL IDLE <seconds>复制监控命令
REPLICAOF
REPLICAOF 命令用于配置 Redis 实例作为其他实例的从节点,或停止复制。
bash
# 配置为从节点
redis-cli REPLICAOF <masterip> <masterport>
# 停止复制,成为主节点
redis-cli REPLICAOF NO ONESYNC
SYNC 命令用于从节点与主节点进行全量同步(通常不需要手动执行)。
PSYNC
PSYNC 命令用于从节点与主节点进行部分同步(通常不需要手动执行)。
持久化监控命令
BGSAVE
BGSAVE 命令用于异步执行 RDB 持久化。
bash
redis-cli BGSAVESAVE
SAVE 命令用于同步执行 RDB 持久化(会阻塞 Redis 服务器,生产环境慎用)。
bash
redis-cli SAVEBGREWRITEAOF
BGREWRITEAOF 命令用于异步执行 AOF 重写。
bash
redis-cli BGREWRITEAOFLASTSAVE
LASTSAVE 命令用于获取最后一次成功执行 RDB 持久化的 Unix 时间戳。
bash
redis-cli LASTSAVE输出示例:
(integer) 1705123456集群监控命令
CLUSTER INFO
CLUSTER INFO 命令用于获取 Redis 集群的状态信息。
bash
redis-cli CLUSTER INFO输出示例:
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1000
cluster_stats_messages_pong_sent:998
cluster_stats_messages_sent:1998
cluster_stats_messages_ping_received:998
cluster_stats_messages_pong_received:1000
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2003CLUSTER NODES
CLUSTER NODES 命令用于获取 Redis 集群中所有节点的详细信息。
bash
redis-cli CLUSTER NODES输出示例:
abcdef1234567890abcdef1234567890abcdef12 127.0.0.1:7001@17001 myself,master - 0 1705123456000 1 connected 0-5460
ghijklmnopqrstuvwxyz0123456789abcdef 127.0.0.1:7002@17002 master - 0 1705123456500 2 connected 5461-10922
stuvwxyz0123456789abcdefghijklmnopqr 127.0.0.1:7003@17003 master - 0 1705123456000 3 connected 10923-16383
wxyz0123456789abcdefghijklmnopqrstuv 127.0.0.1:7004@17004 slave abcdef1234567890abcdef1234567890abcdef12 0 1705123456500 4 connected
abcdef1234567890abcdef1234567890abcdef34 127.0.0.1:7005@17005 slave ghijklmnopqrstuvwxyz0123456789abcdef 0 1705123456000 5 connected
567890abcdef1234567890abcdef1234567890abcd 127.0.0.1:7006@17006 slave stuvwxyz0123456789abcdefghijklmnopqr 0 1705123456500 6 connected键空间监控命令
KEYS
KEYS 命令用于查找匹配特定模式的键。生产环境慎用,因为它会阻塞 Redis 服务器。
bash
# 查找所有键
redis-cli KEYS *
# 查找以 "user:" 开头的键
redis-cli KEYS user:*
# 查找包含 "test" 的键
redis-cli KEYS *test*SCAN
SCAN 命令用于迭代数据库中的键,是 KEYS 命令的非阻塞替代方案。
bash
# 开始迭代,cursor 初始值为 0
redis-cli SCAN 0
# 迭代并匹配特定模式
redis-cli SCAN 0 MATCH user:*
# 每次迭代返回 100 个键
redis-cli SCAN 0 COUNT 100DBSIZE
DBSIZE 命令用于获取当前数据库中的键数量。
bash
redis-cli DBSIZE输出示例:
(integer) 10000EXISTS
EXISTS 命令用于检查一个或多个键是否存在。
bash
redis-cli EXISTS <key1> <key2> ...输出示例:
(integer) 2配置监控命令
CONFIG GET
CONFIG GET 命令用于获取 Redis 配置参数。
bash
# 获取所有配置
redis-cli CONFIG GET *
# 获取特定配置
redis-cli CONFIG GET <parameter>
# 获取多个配置,用通配符
redis-cli CONFIG GET <pattern>CONFIG SET
CONFIG SET 命令用于动态修改 Redis 配置参数。
bash
redis-cli CONFIG SET <parameter> <value>CONFIG REWRITE
CONFIG REWRITE 命令用于将当前的配置写入到配置文件中。
bash
redis-cli CONFIG REWRITECONFIG RESETSTAT
CONFIG RESETSTAT 命令用于重置 INFO 命令返回的统计信息。
bash
redis-cli CONFIG RESETSTAT监控脚本示例
简单的监控脚本
bash
#!/bin/bash
REDIS_HOST="localhost"
REDIS_PORT="6379"
REDIS_PASSWORD="your_strong_password"
# 获取关键指标
CONN=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO clients | grep connected_clients | cut -d: -f2)
MEM=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO memory | grep used_memory_human | cut -d: -f2 | tr -d '\r')
OPS=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO stats | grep instantaneous_ops_per_sec | cut -d: -f2)
HITS=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO stats | grep keyspace_hits | cut -d: -f2)
MISSES=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD INFO stats | grep keyspace_misses | cut -d: -f2)
# 计算命中率
if [ $((HITS + MISSES)) -gt 0 ]; then
HIT_RATE=$(echo "scale=2; $HITS / ($HITS + $MISSES) * 100" | bc)
else
HIT_RATE=0
fi
# 输出监控信息
echo "Redis 监控信息:"
echo "当前时间:$(date)"
echo "连接数:$CONN"
echo "内存使用:$MEM"
echo "每秒操作数:$OPS"
echo "命中率:${HIT_RATE}%"
echo "------------------------"慢查询监控脚本
bash
#!/bin/bash
REDIS_HOST="localhost"
REDIS_PORT="6379"
REDIS_PASSWORD="your_strong_password"
SLOWLOG_THRESHOLD=10000 # 10 毫秒
# 获取慢查询日志
SLOWLOG=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASSWORD SLOWLOG GET 10)
# 解析慢查询日志
if [ -n "$SLOWLOG" ]; then
echo "Redis 慢查询日志(最近 10 条):"
echo "当前时间:$(date)"
echo "------------------------"
echo "ID | 时间 | 耗时(ms) | 命令"
echo "------------------------"
# 使用 awk 解析慢查询日志
echo "$SLOWLOG" | awk '{
if ($1 == "1)") {
id = $2
getline
timestamp = strftime("%Y-%m-%d %H:%M:%S", $2)
getline
duration = $2 / 1000
getline
command = ""
while ($1 != "5)") {
if ($1 == "1)") {
command = $2
} else if ($1 != "4)") {
command = command " " $1
}
getline
}
client = $2
printf "%s | %s | %.2f | %s\n", id, timestamp, duration, command
}
}'
echo "------------------------"
else
echo "没有慢查询日志"
fi最佳实践
定期监控
- 定期运行监控命令,了解 Redis 实例的运行状态
- 建议使用自动化脚本定期收集和分析监控数据
设置告警
- 根据监控数据设置合理的告警阈值
- 当关键指标超过阈值时,及时发送告警通知
避免阻塞命令
- 生产环境中避免使用
KEYS命令 - 使用
SCAN命令替代KEYS命令 - 避免长时间运行
MONITOR命令
- 生产环境中避免使用
优化慢查询
- 定期分析慢查询日志
- 优化执行时间长的命令
- 考虑拆分大键或使用更高效的数据结构
关注内存使用
- 定期监控内存使用情况
- 合理设置内存淘汰策略
- 及时清理过期数据和无用数据
监控客户端连接
- 关注连接数的变化
- 及时关闭空闲连接
- 避免连接泄露
备份监控数据
- 定期备份监控数据,用于趋势分析
- 建立监控数据的历史归档
结合监控系统
- 将 Redis 监控数据集成到监控系统中,如 Prometheus + Grafana
- 实现可视化监控和告警
常见问题(FAQ)
Q1: INFO 命令返回的信息太多,如何只获取特定部分?
A1: 使用 INFO 命令的参数可以只获取特定部分的信息:
bash
# 只获取内存信息
redis-cli INFO memory
# 获取内存和客户端信息
redis-cli INFO memory,clientsQ2: 如何实时监控 Redis 命令执行?
A2: 使用 MONITOR 命令可以实时监控 Redis 命令执行:
bash
# 实时监控 Redis 命令
redis-cli MONITOR
# 监控并将输出保存到文件
redis-cli MONITOR > redis-monitor.logQ3: 如何查找执行时间长的命令?
A3: 使用 SLOWLOG 命令可以查看慢查询日志:
bash
# 获取慢查询日志
redis-cli SLOWLOG GET 10Q4: 如何查看 Redis 内存使用的详细情况?
A4: 可以使用 INFO memory 和 MEMORY STATS 命令查看内存使用详情:
bash
# 获取内存使用详情
redis-cli INFO memory
# 获取更详细的内存统计
redis-cli MEMORY STATSQ5: 如何关闭空闲时间过长的客户端连接?
A5: 使用 CLIENT KILL 命令可以关闭空闲时间过长的客户端:
bash
# 关闭所有空闲时间超过 3600 秒的客户端
redis-cli CLIENT KILL IDLE 3600Q6: 如何查看 Redis 集群的状态?
A6: 使用 CLUSTER INFO 和 CLUSTER NODES 命令可以查看集群状态:
bash
# 获取集群状态
redis-cli CLUSTER INFO
# 获取集群节点信息
redis-cli CLUSTER NODES