跳到主要内容

Redis 命令与日常运维

排障时先收集状态,再改配置;不要上来就重启或清空数据。密码通过 REDISCLI_AUTH 传递,避免 -a 出现在 shell 历史中。

本章使用上一章保留的实验实例。完成后你会得到一套可复用的日常巡检顺序,并能解释每个指标为什么重要。

export REDISCLI_AUTH='<密码>'
redis-cli --user ops info memory
redis-cli --user ops info stats
redis-cli --user ops info replication
redis-cli --user ops info persistence

1. 先建立一次健康基线

“现在高不高”必须和正常值比较。新实例上线后应记录一份基线:

mkdir -p /tmp/redis-baseline
redis-cli --user ops INFO server > /tmp/redis-baseline/server.txt
redis-cli --user ops INFO clients > /tmp/redis-baseline/clients.txt
redis-cli --user ops INFO memory > /tmp/redis-baseline/memory.txt
redis-cli --user ops INFO stats > /tmp/redis-baseline/stats.txt
redis-cli --user ops INFO persistence > /tmp/redis-baseline/persistence.txt

生产巡检应记录时间、实例地址、角色和版本。不要把包含用户名、地址或业务 key 的完整输出公开上传。

2. INFO 输出怎么读

分区先看什么说明
memoryused_memory、碎片率、maxmemory判断是否接近容量边界。
statsops/sec、hits/misses、evicted_keys判断负载、命中率与淘汰。
clientsconnected_clients、blocked_clients连接池或阻塞命令问题。
replicationrole、link status、offset主从是否断链或延迟。
persistence最近保存状态、AOF rewrite判断能否恢复。

2.1 手工计算缓存命中率

redis-cli --user ops INFO stats | grep -E 'keyspace_(hits|misses)'

公式为:

命中率 = hits / (hits + misses) × 100%

命中率降低不一定是 Redis 故障,也可能是新业务上线、TTL 变短、缓存 key 设计改变或大量冷数据访问。必须结合请求量和数据库负载判断。

2.2 查看连接来源

redis-cli --user ops CLIENT LIST
redis-cli --user ops CLIENT INFO

重点关注 addrnameageidlecmd 和输出缓冲。应用应执行 CLIENT SETNAME 标识连接池,便于按服务定位连接泄漏。不要看到连接多就直接提高 maxclients;先检查客户端是否每次请求都新建连接。

3. 慢查询和延迟

redis-cli slowlog get 128
redis-cli slowlog len
redis-cli latency latest
redis-cli latency doctor

慢日志记录的是 Redis 内部执行时间,不包括网络排队。看到慢命令后,结合参数大小、调用频率、业务来源和 CPU/I/O 监控判断,不要只靠一次采样下结论。

可以在实验实例设置较低阈值并制造一条慢操作:

# 单位是微秒;1000 表示超过 1 毫秒记录
redis-cli --user ops CONFIG SET slowlog-log-slower-than 1000
redis-cli --user ops CONFIG SET slowlog-max-len 128

# 只在实验实例运行,创建较多 key 后执行 SORT 等操作观察慢日志
for i in $(seq 1 5000); do redis-cli LPUSH lab:slow-list "$RANDOM" >/dev/null; done
redis-cli SORT lab:slow-list LIMIT 0 5000 >/dev/null
redis-cli --user ops SLOWLOG GET 10

实验后恢复阈值或重启加载配置文件,避免临时 CONFIG SET 被误当成永久配置。是否执行 CONFIG REWRITE 必须经过配置管理流程。

4. Key 的安全查看方式

# 禁止生产使用 KEYS *;SCAN 每次只返回一部分结果
redis-cli --scan --pattern 'app:*' --count 1000 | head -n 100
redis-cli TYPE 'app:session:42'
redis-cli TTL 'app:session:42'
redis-cli MEMORY USAGE 'app:session:42'

COUNT 只是提示值,遍历会有重复,不能把 SCAN 当作一致性快照。删除确认无用的大 key 优先 UNLINK key,它会异步回收内存;清理前先产出审计清单。

4.1 找 BigKey 的正确过程

# 会遍历 keyspace,仅在低峰或副本上执行
redis-cli --user ops --bigkeys

# 对候选 key 精确确认类型、长度和内存
redis-cli --user ops TYPE 'candidate:key'
redis-cli --user ops MEMORY USAGE 'candidate:key' SAMPLES 10
redis-cli --user ops LLEN 'candidate:key'
redis-cli --user ops HLEN 'candidate:key'
redis-cli --user ops SCARD 'candidate:key'
redis-cli --user ops ZCARD 'candidate:key'

BigKey 不只指 value 字节大,也包括成员数量巨大。删除百万成员集合即使用 UNLINK,后台释放仍可能带来 CPU 压力,应限速、分批并监控延迟。

5. 在线修改配置的边界

# 先读取并记录旧值
redis-cli --user ops CONFIG GET maxclients

# 实验示例:临时调整,不代表生产推荐值
redis-cli --user ops CONFIG SET maxclients 2000

# 再读取确认
redis-cli --user ops CONFIG GET maxclients

CONFIG SET 立即生效,但重启后可能丢失;CONFIG REWRITE 会修改配置文件。生产应先改配置管理来源,再滚动重启验证,避免运行值和文件值长期漂移。

6. 一份每日巡检顺序

  1. PING 与端口连通;
  2. INFO server 确认版本、运行时间和角色;
  3. INFO clients 查看连接与阻塞;
  4. INFO memory 检查上限、碎片和峰值;
  5. INFO stats 查看 QPS、命中率、淘汰和错误;
  6. INFO replication 检查复制链路;
  7. INFO persistence 检查 RDB/AOF;
  8. SLOWLOG GETLATENCY LATEST 检查性能异常;
  9. 对比昨天和过去一周基线,而不是只看一次快照。

7. 实验清理

redis-cli --user ops UNLINK lab:slow-list
redis-cli --user ops SLOWLOG RESET

MONITOR 会输出所有命令并可能泄漏数据,且本身有开销;只能短时间、受控使用。CLIENT KILL 先按来源过滤,避免误断业务连接。