当前位置:首页 > 文章列表 > 数据库 > Redis > Redis JSON 和 Hash 存储对象有什么区别

Redis JSON 和 Hash 存储对象有什么区别

来源:17golang原创 2026-10-14 10:10:18 0浏览 收藏

在 Redis 里保存一个用户、商品或配置对象时,Hash 和 JSON 都能完成“一个 key 对应一组数据”,但它们解决的不是同一类问题。先给结论:对象是扁平字段、经常按字段单独读写时优先 Hash;对象包含嵌套结构、数组,或者业务需要按路径修改和查询时优先 JSON。JSON 的建模能力更强,但通常也要接受比 Hash 更高的内存与处理开销。

官方资料:https://redis.io/docs/latest/develop/data-types/

下面用同一个用户对象对照两种方案,再从更新粒度、查询能力和生产资源边界做一次选择。示例命令是说明用法,不代表某个本机执行结果。

先看对象的形状:平面字段还是嵌套文档

Hash 的核心模型是一个 key 下挂多个 field-value 对,字段值按字符串处理,适合姓名、状态、等级、城市这类平面属性。JSON 则保存符合 JSON 格式的对象、数组和嵌套值,可以用路径定位到对象中的一部分。

# Hash:把对象拆成平面字段,适合独立读取和修改
redis-cli HSET user:42 name "林海" age 31 city "杭州"
# 只读取城市字段,不需要取回整个对象
redis-cli HGET user:42 city

# JSON:保留 profile 和 addresses 的层级关系;$ 表示根路径
redis-cli JSON.SET user:42 $ '{"name":"林海","profile":{"level":3},"addresses":[{"city":"杭州"}]}'
# 只读取 profile.level 这条嵌套路径
redis-cli JSON.GET user:42 '$.profile.level'
Redis Hash 字段平面与 JSON 层级文档的结构说明图
图1:Redis Hash 与 JSON 的对象结构说明图,不是运行截图。

这里的分界很重要:Hash 可以把 JSON 字符串塞进某个 field,但那只是“把文档当字符串存放”,Redis 并不知道字符串内部的 profile 或数组,也就不能像 JSON 那样直接按内部路径操作。反过来,如果对象永远只有少量平面字段,直接上 JSON 也会把简单问题带进更复杂的文档模型。

读写粒度决定代码会不会变重

Hash 的常用命令语义直观:HSET 写一个或多个 field,HGET 读一个 field,HMGET 读多个 field,HINCRBY 还能对整数型字段做递增。更新昵称时只改 name,不会触碰同一个 key 下的其他字段。

JSON 的优势是把更新粒度推进到文档内部。比如只调整等级,可以直接写入 $.profile.level;数组也有专门的追加、插入和弹出命令。这个能力更贴近领域对象,但也意味着客户端、服务端命令和部署环境都要支持 JSON 命令。

# Hash:单字段更新,命令和字段边界都很明确
redis-cli HSET user:42 city "宁波"
# 计数类字段可以使用 Hash 的整数递增命令
redis-cli HINCRBY user:42 login_count 1

# JSON:只改嵌套字段,不必重新拼接整个文档
redis-cli JSON.SET user:42 '$.profile.level' 4
# JSON 数组追加一个地址对象;路径必须指向数组
redis-cli JSON.ARRAPPEND user:42 '$.addresses' '{"city":"宁波"}'

如果多个服务只关心对象的不同平面字段,Hash 的字段级并发更新通常更容易约定;如果一个业务动作天然要维护嵌套对象的一致形状,JSON 能减少应用层反序列化、修改、再序列化的样板代码。无论选哪种,都要先写清字段归属,避免一部分代码把同一个 key 当 Hash,另一部分代码又把它当 JSON。

查询能力和资源成本要一起看

Hash 适合按已知 field 读取。需要筛选嵌套属性、数组元素或对文档做更灵活的索引查询时,JSON 更合适;Redis 官方文档也把 JSON 描述为支持层级数组、对象和路径访问,并指出它与 Redis Search 的结构化查询能力结合得更强。

但“查询更灵活”不是免费能力。官方比较资料给出的方向是:文档数据通常是 JSON 的内存和处理要求最高,其次是 Hash,再到字符串。这里不应把它理解为任何场景下的固定基准,而应当理解为选型提醒:缓存数量大、对象扁平、只按字段取值时,Hash 更容易守住资源预算;对象复杂且查询需求真实存在时,JSON 的额外成本才有明确回报。

Redis Hash 与 JSON 按更新粒度查询能力和资源成本进行选型的关系说明图
图2:Redis 对象选型关系说明图,不是性能测试结果或监控截图。
判断维度更倾向 Hash更倾向 JSON
数据形状少量、平面字段嵌套对象、数组、多层文档
更新方式按 field 独立更新按 JSONPath 更新内部节点
读取方式HGET/HMGET 已知字段JSON.GET 读取部分路径或完整文档
查询需求键已知,主要做点查需要文档路径、数组或结构化检索
资源边界更看重简单和紧凑愿意为建模与查询能力付出成本

上线前把选择落成几条规则

第一,先确认部署实例是否提供 JSON 命令,再决定是否把 JSON 当作统一存储格式。第二,为 key 写出稳定的对象边界,例如 user:{id} 只代表一个用户,不要让同一 key 在不同版本中随意改变数据类型。第三,给 Hash 的 field 和 JSON 的路径都建立命名约定,尤其是数组内部字段,避免客户端各写一套路径。

第四,TTL 仍然作用于 key,而不是天然作用于对象内部的每个字段;如果某个子字段必须独立过期,就把它拆成独立 key,或在应用层维护过期信息。第五,迁移时不要只比较命令数量,要同时盘点读写客户端、索引需求、内存预算和回滚方式。可以先新增一组版本化 key,在读路径兼容一段时间,再切换写路径。

# 先查看 key 的数据类型,避免用错命令
redis-cli TYPE user:42
# 迁移前同时记录 TTL,防止新旧 key 的过期策略不一致
redis-cli TTL user:42
# 只在确认 JSON 能力和路径约定后,再修改嵌套字段
redis-cli JSON.SET user:42 '$.profile.level' 4

可以把最终判断压缩成一句话:对象像数据库表里一行的几个简单列,就从 Hash 开始;对象本身就是需要局部访问的文档,就选 JSON;如果两者都能满足需求,优先选择团队更熟、资源预算更容易解释的那一个。

常见问题

Hash 能不能保存嵌套对象?

可以把嵌套 JSON 序列化成某个 field 的字符串,但 Redis 只能把它当字符串读写,不能直接理解内部路径。需要路径级访问时,应使用 JSON 或拆成独立 key。

JSON 一定比 Hash 查询更快吗?

不能这样下结论。JSON 的能力范围更大,但官方资料明确提醒它通常有更高的内存和处理要求。速度要结合数据形状、命令、访问模式和实际资源预算判断,不能只看数据类型名称。

用户资料应该默认用哪一种?

只有姓名、状态、等级等平面字段时,Hash 往往更简单;如果资料包含地址数组、偏好设置等层级数据,并且业务需要单独修改这些内部节点,JSON 更自然。先画出对象结构,再决定比“用户资料”这个名词更可靠。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Redis 分布式锁怎样处理客户端超时Redis 分布式锁怎样处理客户端超时
上一篇
Redis 分布式锁怎样处理客户端超时
Redis Search 查询超时怎样设置上限
下一篇
Redis Search 查询超时怎样设置上限
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    467次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    530次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    548次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    497次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    317次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码