监控Redis服务器健康状况、内存、性能及BullMQ队列。检查队列深度、失败任务,分析慢查询并诊断问题。
哨兵 Redis.是一项面向实际任务的技能,主要用于Monitor Redis 服务器健康, BullMQ队列, 内存, 以及任何消息频道的性能;使用简单英语询问问题 —— 获得可操作的诊断。
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;
若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。
通过任意消息通道监控 Redis 服务器健康状态、BullMQ 队列、内存使用及性能表现。使用自然语言提问,即可获得可操作的诊断结果。
✅ 在以下情况下使用该能力:
❌ 请勿在以下情况下使用该能力:
⚠️ 关键提示:本能力为只读(READ-ONLY)模式,无任何例外。
FLUSHDB、FLUSHALL、DEL、UNLINK、SET、EXPIRE),即使用户明确要求。需解释原因,并建议用户手动执行。CONFIG SET),应引导用户自行操作。REDIS_URL —— 其中可能包含密码。显示前必须对凭据进行掩码处理。若已设置 REDIS_URL 环境变量,则所有命令均使用该 URL:
redis-cli -u "$REDIS_URL"
若未设置 REDIS_URL,则默认连接本地实例:
redis-cli
对于未通过 REDIS_URL 配置但启用了密码认证的实例:
redis-cli -h-p -a
执行任何操作前,请始终先测试连通性:
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" ping
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" ping
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" info server
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" info clients
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" info server | grep -E "redis_version|uptime_in_days|uptime_in_seconds|connected_clients"
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" info memory
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" info memory | grep -E "used_memory_human|used_memory_peak_human|used_memory_rss_human|mem_fragmentation_ratio|maxmemory_human|maxmemory_policy"
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" memory doctor
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" memory usage
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" --bigkeys
mem_fragmentation_ratio > 1.5 → 内存碎片率过高,建议重启 Redismem_fragmentation_ratio < 1.0 → Redis 正在交换到磁盘,属严重问题used_memory 接近 maxmemory → 将依据 maxmemory_policy 开始驱逐数据memory doctor 返回 “Sam, I have no memory problems” → 当前无内存问题redis-cli -u "${REDIS_URL:-redis://localhost:6379}" slowlog get 10
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" slowlog len
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" config get slowlog-log-slower-than
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" --latency -c 10
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" --latency-history -i 1 -c 5
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" info keyspace
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" info commandstats
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" client list
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" info clients | grep -E "connected_clients|blocked_clients|tracking_clients"
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" client list | awk -F' ' '{for(i=1;i<=NF;i++) if($i ~ /^idle=/) print $0}' | grep -E 'idle=[3-9][0-9]{2,}|idle=[0-9]{4,}'
BullMQ 使用 Redis 作为后端存储。队列键名遵循模式:bull:。
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" scan 0 match "bull:*:meta" count 100
对于名为 的队列:
echo "=== Queue:===" echo -n "Waiting: "; redis-cli -u "${REDIS_URL:-redis://localhost:6379}" llen "bull: :wait" echo -n "Active: "; redis-cli -u "${REDIS_URL:-redis://localhost:6379}" llen "bull: :active" echo -n "Delayed: "; redis-cli -u "${REDIS_URL:-redis://localhost:6379}" zcard "bull: :delayed" echo -n "Failed: "; redis-cli -u "${REDIS_URL:-redis://localhost:6379}" zcard "bull: :failed" echo -n "Completed: "; redis-cli -u "${REDIS_URL:-redis://localhost:6379}" zcard "bull: :completed" echo -n "Paused: "; redis-cli -u "${REDIS_URL:-redis://localhost:6379}" llen "bull: :paused"
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" zrange "bull::failed" 0 9
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" hgetall "bull::"
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" hmget "bull::" data failedReason stacktrace attemptsMade timestamp processedOn finishedOn
长时间未更新的活跃任务可能存在卡住风险:
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" lrange "bull::active" 0 -1
随后对每个任务 ID 检查 processedOn 时间戳:
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" hmget "bull::" processedOn name
若 processedOn 超过 10 分钟且任务仍处于活跃状态,则可能已卡住。
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" xinfo groups "bull::events" 2>/dev/null || echo "No event stream found"
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" zrange "bull::repeat" 0 -1
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" scan 0 match "" count 100
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" type
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" ttl
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" object encoding
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" object idletime
redis-cli -u "${REDIS_URL:-redis://localhost:6379}" eval "local count = 0; local cursor = '0'; repeat local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1], 'COUNT', 1000); cursor = result[1]; count = count + #result[2]; until cursor == '0'; return count" 0 "*"
运行健康检查脚本以获取综合概览:
bash scripts/redis-health.sh "${REDIS_URL:-redis://localhost:6379}"
该脚本输出内容包括:
redis-cli --latency -c 10slowlog get 10KEYS/SMEMBERS/HGETALL → 建议改用对应 SCAN 变体connected_clients → 若 > 1000,需排查连接池配置blocked_clients → 若 > 0,需检查 BLPOP/BRPOP 消费者info memory → 对比 used_memory 与 maxmemory--bigkeys → 查找最大 Keymaxmemory_policy → 是否已启用驱逐策略?memory doctor → 遵循其建议scan 并逐一检查 ttlwait 状态?active 列表 → 是否存在长期处于活跃状态的任务?processedOn 时间戳是否过旧?xinfo groups 验证 Worker 是否已正确连接failed 集合 → 读取 failedReason 和 stacktracezrange bull::failed -10 -1 failedReason 和 stacktraceattemptsMade → 是否已耗尽重试次数?data → 负载内容是否格式异常?REDIS_URL 时,默认使用 redis://localhost:6379scan 命令适用于生产环境(非阻塞),而 keys 命令严禁在生产环境中使用bull:;若使用了自定义前缀,请相应替换 bull:redis-cli 命令中添加 -c 参数