Skip to content

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

常用信息部分

  1. server: 服务器基本信息
  2. clients: 客户端连接信息
  3. memory: 内存使用信息
  4. persistence: 持久化信息
  5. stats: 统计信息
  6. replication: 复制信息
  7. cpu: CPU 使用信息
  8. commandstats: 命令统计信息
  9. cluster: 集群信息
  10. 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: 进程 ID
  • config_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) ""

输出字段说明:

  1. 慢查询日志的唯一 ID
  2. 命令执行的 Unix 时间戳
  3. 命令执行的耗时(微秒)
  4. 执行的命令及其参数
  5. 客户端 IP 和端口
  6. 客户端名称(如果有)

内存监控命令

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) 48

MEMORY 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: 客户端 ID
  • addr: 客户端 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=client

CLIENT 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 ONE

SYNC

SYNC 命令用于从节点与主节点进行全量同步(通常不需要手动执行)。

PSYNC

PSYNC 命令用于从节点与主节点进行部分同步(通常不需要手动执行)。

持久化监控命令

BGSAVE

BGSAVE 命令用于异步执行 RDB 持久化。

bash
redis-cli BGSAVE

SAVE

SAVE 命令用于同步执行 RDB 持久化(会阻塞 Redis 服务器,生产环境慎用)。

bash
redis-cli SAVE

BGREWRITEAOF

BGREWRITEAOF 命令用于异步执行 AOF 重写。

bash
redis-cli BGREWRITEAOF

LASTSAVE

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:2003

CLUSTER 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 100

DBSIZE

DBSIZE 命令用于获取当前数据库中的键数量。

bash
redis-cli DBSIZE

输出示例:

(integer) 10000

EXISTS

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 REWRITE

CONFIG 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

最佳实践

  1. 定期监控

    • 定期运行监控命令,了解 Redis 实例的运行状态
    • 建议使用自动化脚本定期收集和分析监控数据
  2. 设置告警

    • 根据监控数据设置合理的告警阈值
    • 当关键指标超过阈值时,及时发送告警通知
  3. 避免阻塞命令

    • 生产环境中避免使用 KEYS 命令
    • 使用 SCAN 命令替代 KEYS 命令
    • 避免长时间运行 MONITOR 命令
  4. 优化慢查询

    • 定期分析慢查询日志
    • 优化执行时间长的命令
    • 考虑拆分大键或使用更高效的数据结构
  5. 关注内存使用

    • 定期监控内存使用情况
    • 合理设置内存淘汰策略
    • 及时清理过期数据和无用数据
  6. 监控客户端连接

    • 关注连接数的变化
    • 及时关闭空闲连接
    • 避免连接泄露
  7. 备份监控数据

    • 定期备份监控数据,用于趋势分析
    • 建立监控数据的历史归档
  8. 结合监控系统

    • 将 Redis 监控数据集成到监控系统中,如 Prometheus + Grafana
    • 实现可视化监控和告警

常见问题(FAQ)

Q1: INFO 命令返回的信息太多,如何只获取特定部分?

A1: 使用 INFO 命令的参数可以只获取特定部分的信息:

bash
# 只获取内存信息
redis-cli INFO memory

# 获取内存和客户端信息
redis-cli INFO memory,clients

Q2: 如何实时监控 Redis 命令执行?

A2: 使用 MONITOR 命令可以实时监控 Redis 命令执行:

bash
# 实时监控 Redis 命令
redis-cli MONITOR

# 监控并将输出保存到文件
redis-cli MONITOR > redis-monitor.log

Q3: 如何查找执行时间长的命令?

A3: 使用 SLOWLOG 命令可以查看慢查询日志:

bash
# 获取慢查询日志
redis-cli SLOWLOG GET 10

Q4: 如何查看 Redis 内存使用的详细情况?

A4: 可以使用 INFO memory 和 MEMORY STATS 命令查看内存使用详情:

bash
# 获取内存使用详情
redis-cli INFO memory

# 获取更详细的内存统计
redis-cli MEMORY STATS

Q5: 如何关闭空闲时间过长的客户端连接?

A5: 使用 CLIENT KILL 命令可以关闭空闲时间过长的客户端:

bash
# 关闭所有空闲时间超过 3600 秒的客户端
redis-cli CLIENT KILL IDLE 3600

Q6: 如何查看 Redis 集群的状态?

A6: 使用 CLUSTER INFO 和 CLUSTER NODES 命令可以查看集群状态:

bash
# 获取集群状态
redis-cli CLUSTER INFO

# 获取集群节点信息
redis-cli CLUSTER NODES