在 Redis 中查看所有 key 有多种方法,但需要特别注意效率和安全性问题,特别是在生产环境中。
KEYS *
问题: - 会阻塞 Redis 服务直到所有 key 返回 - 在大 key 数量的数据库中会导致性能问题
SCAN cursor [MATCH pattern] [COUNT count]
示例:
# 第一次扫描
SCAN 0 MATCH * COUNT 1000
# 使用返回的游标继续扫描
SCAN 12345 MATCH * COUNT 1000
优点: - 非阻塞式迭代 - 可以分批获取 key - 可以指定匹配模式和返回数量
redis-cli --scan --pattern '*'
redis-cli --bigkeys
INFO keyspace
这会返回每个数据库的 key 数量统计,但不列出具体 key。
user:*
而非 *
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
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));
请根据您的具体需求选择合适的方法,生产环境务必谨慎操作。