Redis数据类型嵌套存储方案_利用Hash存储结构化嵌套对象

酷明大大_5806

酷明大大_5806

2026-05-22

540人浏览

原创

redis hash不支持嵌套对象,必须扁平化为一级键值对(如profile:name)、存json字符串(需客户端解析),或拆分为独立key引用(如addr:201),三者在原子性、一致性、性能上各有权衡。

redis数据类型嵌套存储方案_利用hash存储结构化嵌套对象

Hash 里不能直接存嵌套对象,得扁平化

Redis 的 HASH 类型只支持字符串类型的字段值,不接受 JSON、嵌套 HASH 或其他 Redis 数据类型作为字段值。你试图用 HSET user:1001 profile '{"name":"Alice","addr":{"city":"Beijing"}}' 存进去,实际只是把整个 JSON 当成一个字符串塞进去了——后续没法用 Redis 命令直接查 profile.addr.city。

  • 所有嵌套结构必须提前展开成一级键值对,比如:HSET user:1001 profile:name Alice profile:addr:city Beijing profile:addr:zip 100000
  • 字段名用冒号分隔是常见约定,但不是强制;只要语义清晰、避免冲突即可(比如别用 user:1001:name,那属于 KEY 层级命名)
  • 如果原始结构深度大、字段多,手动扁平化易错,建议在业务代码里统一做序列化前的转换,而不是靠人工拼 key

用 JSON 字符串存进 Hash 字段也行,但得自己解析

如果你坚持保留嵌套结构的可读性,可以把整个对象 JSON 序列化后存为单个字段,比如 HSET user:1001 profile '{"name":"Alice","addr":{"city":"Beijing"}}'。这能存,也能取,但 Redis 本身完全不理解里面的内容。

  • HGET user:1001 profile 返回的是完整 JSON 字符串,后续解析、修改、更新都得靠客户端完成
  • 想改其中某个子字段(比如只更新 city),必须先 HGET 出来、JSON.parse、改完、JSON.stringify、再 HSET 回去——有并发风险,且无法原子操作
  • 这种做法适合「只读」或「整对象替换」场景,比如用户配置快照;不适合高频局部更新

Hash + 多 Key 组合比纯 Hash 嵌套更灵活

真要支持部分更新、原子操作、以及跨对象关联(比如多个用户共用一个地址 ID),不如把嵌套结构拆成独立 Redis Key,再用 Hash 字段存引用。

redis-tools
redis-tools

按类别查找Redis命令、检测服务器连接、监控键数量和内存占用,支持离线速查表。

下载
  • 例如:SET addr:201 '{"city":"Beijing","zip":"100000"}',然后 HSET user:1001 profile:name Alice profile:addr_id 201
  • 这样更新地址时只需改 addr:201,所有引用它的用户自动生效;HSET 和 SET 都是原子的
  • 代价是读取时多一次网络往返(HGET + GET),但换来的是数据一致性、复用性和可维护性
  • 注意:Redis 没有外键约束,addr:201 被删了而 user:1001 还指着它,就是脏引用——得靠业务层兜底或加 TTL 对齐

别忽略内存和序列化开销

扁平化后字段数变多,JSON 字符串存整对象会重复存储字段名,这两种方式在内存占用和网络传输上差异明显。

  • 100 个用户,每人 profile 有 8 个字段,扁平化后就是 800 个 HASH 字段;而 JSON 方式只有 100 个字段,但每个值多带约 30% 的冗余字符(引号、冒号、逗号、花括号)
  • HLEN 查字段数、HGETALL 批量取值,在字段极多时可能阻塞主线程(尤其 Redis HSCAN 分批
  • 如果字段值普遍很小(如全是短字符串),扁平化通常更省内存;如果嵌套深、字段名长、值大,JSON 可能反而紧凑些——得实测 MEMORY USAGE

嵌套结构怎么存,本质是在「Redis 原生能力边界」和「业务操作便利性」之间找平衡点。没有银弹,但最容易被忽略的是:一开始图省事用 JSON 字符串硬塞,等要加字段校验、做局部更新、对接缓存穿透防护时,才发现改不动了。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

redis

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.31

3051

5

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.31

554

9

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

2026.02.12

522

19

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4589

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4155

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7772

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

643

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

756

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

7782

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习