如何在Redis数据库中获取指定键空间下的所有键对应JSON数据?
如何在Redis数据库中获取指定键空间下的所有键对应JSON数据?
看起来你遇到的核心问题是:想通过通配符批量获取某个键空间下的所有JSON数据,但当前的getMSData函数只支持单个键的查询,直接传带*的匹配符给它肯定行不通——毕竟RedisJSON的JSON.GET命令本身就不支持通配符参数。我来帮你一步步解决这个问题。
问题根源拆解
你之前调用getRemoteConfigs(Remote_Configs_${props.currentWkspcid}:*)时,本质是把通配符字符串传给了getMSData,但这个函数内部是调用client.json.get(key),而这个方法只能接收单个具体的键名,不支持模式匹配。所以必须先拿到所有符合匹配规则的键,再批量获取它们的JSON数据。
解决方案步骤
1. 先在Redis连接器中新增「获取匹配键列表」的方法
推荐用SCAN命令而非KEYS命令——因为KEYS在数据量大的情况下会阻塞Redis实例,而SCAN是渐进式扫描,更安全稳定。在你的RedisConnector中新增以下函数:
export async function getMatchingKeys(pattern: string) { await connect(); const keys: string[] = []; let cursor = '0'; // 渐进式扫描所有匹配的键 do { const [newCursor, foundKeys] = await client.scan(cursor, { MATCH: pattern, COUNT: 100 // 每次扫描的键数量,可根据你的数据量调整 }); keys.push(...foundKeys); cursor = newCursor; } while (cursor !== '0'); return keys; }
2. 修改中间件函数,实现批量获取JSON数据
现在修改你的getRemoteConfigs函数,先拿到所有匹配的键,再批量获取每个键对应的JSON数据:
'use server' import { getMSData, getMatchingKeys } from "@/lib/RedisConnector"; export default async function getRemoteConfigs(pattern: string) { // 第一步:获取所有符合匹配规则的键 const matchingKeys = await getMatchingKeys(pattern); if (matchingKeys.length === 0) return {}; // 第二步:批量获取每个键的JSON数据 const configData = await Promise.all( matchingKeys.map(key => getMSData(key, "JSON")) ); // 可选:把键和对应的数据配对成对象,方便前端使用 return matchingKeys.reduce((result, key, index) => { result[key] = configData[index]; return result; }, {} as Record<string, any>); }
3. (可选)优化:用RedisJSON批量命令提升效率
如果你的Redis实例安装了RedisJSON模块,还可以用JSON.MGET命令一次性获取多个键的JSON数据,比循环调用JSON.GET效率更高。在RedisConnector中新增批量获取方法:
export async function getBatchJSONData(keys: string[]) { await connect(); // '.' 表示获取整个JSON对象,而非指定路径 return await client.json.mget(keys, '.'); }
然后修改中间件函数:
export default async function getRemoteConfigs(pattern: string) { const matchingKeys = await getMatchingKeys(pattern); if (matchingKeys.length === 0) return {}; const configData = await getBatchJSONData(matchingKeys); return matchingKeys.reduce((result, key, index) => { result[key] = configData[index]; return result; }, {} as Record<string, any>); }
前端调用保持不变
你之前的前端调用代码完全不用改,还是:
getRemoteConfigs(`Remote_Configs_${props.currentWkspcid}:*`)
注意事项
- 优先用
SCAN而非KEYS:尤其是在数据量较大的生产环境中,KEYS会导致Redis阻塞,影响其他业务。 - 并发控制:如果匹配到的键数量极多,
Promise.all可能会触发过多并发请求,可以考虑分批处理(比如每50个键一批)。 - 模块依赖:确保你的Redis实例已经正确安装并启用了RedisJSON模块,否则JSON相关命令会失效。
内容来源于stack exchange
相关产品推荐
相关产品推荐

