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
相关产品推荐
相关产品推荐

