插件窝 干货文章 Redis 中如何高效地查看所有 key

Redis 中如何高效地查看所有 key

Redis cursor ScanParams SCAN 661    来源:    2025-03-29

Redis 中高效查看所有 key 的方法

在 Redis 中查看所有 key 有多种方法,但需要特别注意效率和安全性问题,特别是在生产环境中。

1. KEYS 命令(不推荐生产环境使用)

KEYS *

问题: - 会阻塞 Redis 服务直到所有 key 返回 - 在大 key 数量的数据库中会导致性能问题

2. SCAN 命令(推荐)

SCAN cursor [MATCH pattern] [COUNT count]

示例

# 第一次扫描
SCAN 0 MATCH * COUNT 1000

# 使用返回的游标继续扫描
SCAN 12345 MATCH * COUNT 1000

优点: - 非阻塞式迭代 - 可以分批获取 key - 可以指定匹配模式和返回数量

3. 使用 Redis 工具

redis-cli 的 --scan 选项

redis-cli --scan --pattern '*'

redis-cli 的 bigkeys 选项

redis-cli --bigkeys

4. 使用 INFO 命令查看 key 统计

INFO keyspace

这会返回每个数据库的 key 数量统计,但不列出具体 key。

5. 生产环境最佳实践

  1. **避免使用 KEYS ***:可能导致服务不可用
  2. 使用 SCAN 替代:分批获取 key
  3. 在从节点执行:如果必须扫描大量 key,在从节点执行
  4. 限制匹配模式:使用更具体的模式如 user:* 而非 *
  5. 考虑使用 Lua 脚本:如果需要复杂操作

6. 编程语言客户端示例

Python (redis-py)

import redis

r = redis.Redis()
cursor = 0
keys = []
while True:
    cursor, partial_keys = r.scan(cursor, match='*', count=1000)
    keys.extend(partial_keys)
    if cursor == 0:
        break

Java (Jedis)

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;

Jedis jedis = new Jedis("localhost");
String cursor = ScanParams.SCAN_POINTER_START;
ScanParams scanParams = new ScanParams().count(1000).match("*");
do {
    ScanResult<String> result = jedis.scan(cursor, scanParams);
    cursor = result.getCursor();
    result.getResult().forEach(System.out::println);
} while (!cursor.equals(ScanParams.SCAN_POINTER_START));

请根据您的具体需求选择合适的方法,生产环境务必谨慎操作。