插件窝 干货文章 如何在不阻塞 Redis 的情况下查看所有 key

如何在不阻塞 Redis 的情况下查看所有 key

Redis 使用 阻塞 key 527    来源:    2025-03-29

在不阻塞 Redis 的情况下查看所有 key

在 Redis 中查看所有 key 而不阻塞服务是一个常见需求,因为 KEYS * 命令在生产环境中可能会造成性能问题。以下是几种安全的方法:

推荐方法:使用 SCAN 命令

SCAN 是 Redis 提供的非阻塞式迭代器,可以安全地在生产环境中使用:

# 基本用法
redis-cli SCAN 0

# 带匹配模式的扫描
redis-cli SCAN 0 MATCH "prefix:*"

# 设置每次返回的数量(不保证精确)
redis-cli SCAN 0 COUNT 1000

SCAN 命令特点: - 不会阻塞 Redis 服务器 - 每次调用返回一个游标和部分结果 - 需要多次调用直到游标返回0 - 可能会返回重复的key,需要在客户端去重

其他替代方案

1. 使用 Redis 的 keyspace 通知

如果只需要监控 key 的变化而不是一次性获取所有 key,可以配置 keyspace 通知。

2. 使用 Redis 的 DEBUG 命令 (不推荐生产环境)

redis-cli --bigkeys

这个命令会扫描 key 空间但比 KEYS * 更温和。

3. 使用 Redis 的 RDB 文件分析

可以: 1. 执行 BGSAVE 创建 RDB 快照 2. 使用 redis-rdb-tools 等工具分析 RDB 文件

自动化脚本示例

#!/bin/bash

cursor=0
keys=""

while true; do
  # 使用SCAN命令,每次返回1000个key
  reply=$(redis-cli SCAN $cursor COUNT 1000)

  # 解析返回结果
  cursor=$(echo "$reply" | head -n 1)
  newkeys=$(echo "$reply" | tail -n +2)

  keys="$keys $newkeys"

  # 当游标为0时结束
  if [[ $cursor -eq 0 ]]; then
    break
  fi
done

echo "所有key:"
echo $keys | tr ' ' '\n' | sort | uniq

注意事项

  1. 即使使用 SCAN,在大 key 空间上操作仍可能影响性能
  2. 考虑在从节点上执行这些操作
  3. 对于非常大的 Redis 实例,最好使用专门的监控工具
  4. 定期审计 key 空间比一次性查看所有 key 更有价值

以上方法可以帮助您在不阻塞 Redis 服务的情况下安全地查看 key。