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

Node.js中如何将对象存储到Redis Hash结构的value中

Redis 原生 Hash 结构仅支持一维键值对,无法直接存储嵌套对象,要实现你的需求可以参考以下两种方案:

方案一:整对象序列化存储(推荐,实现最简单)

将整个嵌套对象序列化为JSON字符串,存入Hash的单个字段,查询后反序列化即可得到原结构:

存储代码

const redis = require('redis');
const client = redis.createClient(); // 按需补充Redis连接配置

// 目标存储对象
const targetData = {
  child1: {key1: 'val1', key2: 'val2'},
  child2: {key1: 'val1', key2: 'val2'},
  child3: {key1: 'val1', key2: 'val2'}
};

// 序列化后存入Hash的data字段
client.hset('user:123', 'data', JSON.stringify(targetData), (err) => {
  if (err) throw err;
});

查询代码

注意你示例中查询键写为users:123,和存储键user:123不一致,实际使用需统一键名

client.hmget('user:123', 'data', (err, res) => {
  if (err) throw err;
  const result = JSON.parse(res[0]);
  console.log(result); // 输出与原嵌套结构完全一致
});

方案二:子对象分别序列化(适合需要单独操作子字段的场景)

如果需要单独读取/修改child1这类子对象,可以将每个子对象单独序列化后作为Hash的字段值存储:

存储代码

const multi = client.multi();
Object.entries(targetData).forEach(([childKey, childValue]) => {
  multi.hset('user:123', childKey, JSON.stringify(childValue));
});
multi.exec((err) => {
  if (err) throw err;
});

查询代码

client.hgetall('user:123', (err, res) => {
  if (err) throw err;
  // 批量反序列化所有子字段
  const result = Object.fromEntries(
    Object.entries(res).map(([key, value]) => [key, JSON.parse(value)])
  );
  console.log(result); // 输出与原嵌套结构完全一致
});

内容的提问来源于stack exchange,提问作者Shree

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:39:02