当前位置:首页 > 文章列表 > 科技周边 > 业界新闻 > Redis 8.10 Compact Hash新哈希布局会影响哪些内存场景

Redis 8.10 Compact Hash新哈希布局会影响哪些内存场景

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

Redis 8.10 的 Compact Hash 主要解决一种很具体的内存重复:大量 Hash key 拥有相同或基本稳定的 field 集合,却为每个 key 重复保存字段名。对用户资料、订单快照、会话对象这类“同一结构、很多实例”的数据,它可能明显减少字段名开销;对字段集合经常变化、使用字段过期或只有少量 key 的数据,收益就不能想当然。

官方地址:https://redis.io/docs/latest/develop/whats-new/8-10/

判断是否值得迁移的关键,不是看到“Compact”就改命令,而是先确认:有多少个 Hash 共享同一套字段、字段是否稳定、是否能接受先在影子环境观察模板指标。

Compact Hash 真正省的是哪一部分内存

传统 Hash 可以理解为每个 key 都带着自己的 field-name 集合。假设有数百万个用户对象,每个对象都包含 name、email、country 和 last_login,字段名本身会被反复保存。Compact Hash 把共享字段集合抽成模板,多个 key 只保留各自的值和对模板的引用。

Redis 8.10 Compact Hash 共享字段模板与独立值的结构说明图
图1:Compact Hash 布局说明图,展示共享字段集合与独立值之间的关系,不是运行截图。

这带来三个判断点:

  • 重复结构越多,字段名被共享的空间越大,节省越有意义。
  • 已有的 HGET、HGETALL、HSET 等命令语义不需要改写,变化主要在内部编码。
  • “最多降低 50%”是官方针对特定宽度和数据形状给出的上限信号,不是每个线上实例的固定比例。

什么时候用 HIMPORT,什么时候保持现有 HSET

如果应用正在批量创建同构 Hash,可以使用 Redis 8.10 新增的 HIMPORT。它先在当前连接准备一个有序 fieldset,之后每个 key 只发送对应顺序的值。示意命令如下:

# 只在当前连接声明一次稳定的字段顺序
redis-cli HIMPORT PREPARE profile name email country last_login

# 按上面字段顺序写入值,避免每个 key 重复发送字段名
redis-cli HIMPORT SET user:1001 profile Alice alice@example.test CN 2026-09-14T08:00:00Z
redis-cli HIMPORT SET user:1002 profile Bob bob@example.test US 2026-09-14T08:02:00Z

# 会话结束或不再使用时,清理当前连接的 fieldset
redis-cli HIMPORT DISCARD profile

HIMPORT 的 fieldset 是连接级的,会话断开或执行 RESET 后不再可用。因此它适合由批处理客户端长期控制连接和字段顺序的场景,不适合把 fieldset 名称当成跨连接的全局配置。

如果暂时不能改客户端,也可以考虑让普通写入路径自动转换。Redis 8.10 提供了 hash-min-template-entries 和 hash-max-template-entries 等配置,转换是惰性的:运行 CONFIG SET 后,已有 Hash 不会瞬间全部重写,而是在后续写入时判断。可以先在非生产环境用较窄的范围观察:

# 只让字段数在 4 到 16 之间的 Hash 参与后续写入转换
redis-cli CONFIG SET hash-min-template-entries 4
redis-cli CONFIG SET hash-max-template-entries 16

# 记录配置,便于回滚或在变更单中保留当前值
redis-cli CONFIG GET hash-min-template-entries hash-max-template-entries

这里的数字不是通用推荐值。若业务 Hash 经常追加临时字段、字段过宽,或者使用字段级过期,应该先保留普通布局,再根据观测结果调整。

用哪些指标判断内存收益

我会把“迁移成功”拆成三个可观察的问题:模板有没有形成、多少 key 在引用、单个 key 的统计是否包含模板分摊。Redis 8.10 增加了相应指标:

观察入口重点字段它回答的问题
INFO STATShash_templates、hash_template_keys有多少模板、多少 key 使用了 Compact Hash
INFO MEMORYused_memory_hash_templates共享模板整体占用了多少内存
MEMORY USAGE key单 key 使用量该 key 的数值包含它分摊到的模板成本
Redis 8.10 Compact Hash 内存指标之间的关系说明图
图2:内存指标关系说明图,展示模板数量、引用键数量和单键统计口径,不是监控截图。

这些数字要和业务对象数量一起看。只有一个或几个 key 的小数据集,即使被转换,也未必能抵消模板本身的成本;大量同构 key 才更容易体现共享字段名的价值。比较前后时还要保持样本规模、字段集合和采样时间一致,避免把业务增长误判为布局收益。

# 查看 Compact Hash 的模板数量与引用键数量
redis-cli INFO STATS | grep -E 'hash_templates|hash_template_keys'

# 查看共享模板占用的整体内存
redis-cli INFO MEMORY | grep used_memory_hash_templates

# 查看某个 Hash 的统计口径;结果含该 key 分摊的模板成本
redis-cli MEMORY USAGE user:1001

升级时最容易忽略的四个边界

  1. 字段集合不稳定:如果每个 Hash 都在追加不同字段,模板复用率会下降,后续维护也更难判断。
  2. 字段过期:官方文档明确指出,使用 field expiration 的 Hash 不会因为字段数满足条件就转换。
  3. 超宽 Hash:hash-max-template-entries 可以把过宽对象排除在自动转换之外,避免把不适合共享的结构塞进注册表。
  4. 旧 RDB 升级:RDB 加载转换是有条件的升级路径,不等于对所有现存数据立即重写;要把加载时间和内存峰值单独纳入评估。

最后可以用一张小清单收口:同构 Hash 是否足够多?字段名是否稳定?是否使用字段过期?客户端能否维持 HIMPORT 连接会话?模板指标是否连续增长?只有前四项大多为“是”,并且观测到模板引用数量稳定增加,才值得继续扩大范围。

常见问题

Compact Hash 会改变现有 Hash 命令的返回结果吗?不会。它是内部编码,重点变化是字段名存储方式;已有 Hash 命令仍按原语义读写。

开启自动转换后,内存会立刻下降吗?不一定。写入路径的自动转换按后续写入惰性触发,旧数据还要结合 RDB 加载配置或业务迁移窗口评估。

HIMPORT 是否适合所有批量写入?不适合。只有字段集合稳定、客户端能维持连接级 fieldset、并且数据量足够大时,才有机会同时获得网络与内存收益。

参考资料:https://redis.io/docs/latest/develop/data-types/hashes/、https://redis.io/docs/latest/commands/himport/、https://redis.io/docs/latest/commands/memory-usage/

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go 1.27 encoding/json/v2新 JSON 包适合哪些迁移边界Go 1.27 encoding/json/v2新 JSON 包适合哪些迁移边界
上一篇
Go 1.27 encoding/json/v2新 JSON 包适合哪些迁移边界
Python 3.15.1小版本升级前怎样安排兼容检查
下一篇
Python 3.15.1小版本升级前怎样安排兼容检查
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之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模型性能。
    881次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    879次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    963次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    942次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    768次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码