You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 14:35:32