当前位置:首页 > 文章列表 > 数据库 > Redis > Redis OBJECT ENCODING 变化为什么会影响性能判断

Redis OBJECT ENCODING 变化为什么会影响性能判断

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

我排查 Redis 内存和延迟时,最容易误判的一项就是 OBJECT ENCODING。同一个 hash 从 listpack 变成 hashtable,确实说明内部布局变了,但它不等于“这条命令马上变慢”,更不能单凭一个字符串判断整台 Redis 的性能。正确做法是:先看编码变化由什么数据或配置触发,再把它和 MEMORY USAGE、访问模式以及 P95/P99 延迟放在一起比较。

要点速览
  • OBJECT ENCODING 只报告 key 当前的内部编码,key 不存在时返回空值。
  • 小型 hash、list、set、zset 常用紧凑编码;元素数量或长度超过阈值后会自动转换。
  • 性能判断至少需要编码、内存、命令访问模式和尾延迟四类证据。

先看懂 OBJECT ENCODING 返回的是什么

这个命令的时间复杂度是 O(1),用途是观察 Redis 对某个 key 采用了什么内部表示。它不读取“这条 key 的平均耗时”,也不保证返回值在不同 Redis 版本之间完全相同。例如 Redis 7 及以后,小型 hash 和 zset 常见的是 listpack;旧版本文档里还会看到 ziplist。列表可能显示为 quicklist,整数集合可能显示为 intset

先建立一份不改变数据的基线:

# 同时确认类型、内部布局和当前占用,避免只看 encoding 下结论
redis-cli TYPE profile:1001
redis-cli OBJECT ENCODING profile:1001
redis-cli MEMORY USAGE profile:1001 SAMPLES 0

TYPE 能防止把不同数据结构混在一起比较;MEMORY USAGE 则补上编码名称没有提供的内存证据。若 key 已过期或根本不存在,编码命令会返回空值,这种结果不能当作“编码异常”。

Redis TYPE 与 OBJECT ENCODING 连接 hash list set zset、listpack、hashtable 和 quicklist 的静态结构关系图
图1:Redis 内部编码的结构示意,展示数据类型、紧凑编码与通用编码之间的静态关系。

为什么元素变大后编码会自动切换

Redis 会为小型聚合类型选择更省空间的表示,这是内存和 CPU 之间的取舍。以 Redis 7+ 为例,hash 使用 hash-max-listpack-entrieshash-max-listpack-value 这样的配置约束;zset、set 也有对应阈值。元素数量变多,或者单个 field/value 超过允许长度,Redis 就可能把紧凑布局转换成通用布局。这个转换通常是为了维持后续操作的可用性,不是随机降级。

因此看到编码变化时,我会先问三个问题:发生在 hash、list 还是 set?变化前后数据规模是否跨过数量边界?是否出现了一个特别长的元素?另外要注意版本差异:不要把旧教程中的 ziplist 名称直接套到新实例上,也不要手工把 listpack 当成稳定的应用接口。

观察结果更可能说明什么下一步怎么做
listpack → hashtablehash/set/zset 触发数量或长度边界对照配置与元素分布,再看内存和延迟
ziplist → listpackRedis 版本或内部实现名称变化先确认版本,不要直接比较字符串
encoding 为空key 不存在、已过期或名称写错先执行 TYPE、EXISTS 和 TTL

编码变化不等于性能结论

紧凑编码通常能减少对象和指针开销,适合小对象;代价是某些操作需要在一段紧凑数据中查找或搬移。通用编码的内存开销可能更高,但对较大的对象或更复杂的访问模式更合适。真正的结果取决于命令种类、元素分布、读写比例、并发和是否频繁触发扩容。

我会把诊断拆成四层:OBJECT ENCODING 说明布局,MEMORY USAGE 说明单 key 成本,业务命令统计说明访问路径,P95/P99 则说明用户是否真的感知到变化。若只是编码变了、内存下降、尾延迟没有变化,就没有理由为了“恢复旧编码”去改配置;若只有长元素写入时出现尖峰,则应重点看转换时机和写入批次。

Redis OBJECT ENCODING、MEMORY USAGE、访问模式、CPU 常数开销和 P95 P99 延迟之间的证据关系图
图2:从编码观察到性能判断的证据关系示意,强调需要同时看内存、访问模式与尾延迟。

调整阈值前先做一组可复现对照

不要直接在生产环境把 listpack 阈值调大。准备固定数量和长度分布的数据,分别记录编码、内存、典型命令的吞吐及 P95/P99;再改变一个阈值重复测试。尤其要覆盖扩容、删除后再写入、批量 HSET 和最坏长度元素,因为平均值可能掩盖一次转换带来的抖动。

# 只展示观察命令;压测应使用脱敏、可重复的数据集
redis-cli OBJECT ENCODING cart:1001
redis-cli MEMORY USAGE cart:1001 SAMPLES 0
redis-cli INFO commandstats | grep -E 'cmdstat_(hget|hset|lrange)'
redis-cli LATENCY LATEST

我的选择规则很简单:容量紧张且对象确实小,优先保留紧凑编码;对象已经较大、访问频繁或尾延迟敏感,则先保证数据形态稳定,再用基准测试决定是否牺牲一些内存换更可预测的访问成本。阈值调整后还要同步记录到配置文件,避免重启恢复旧值。

相关问题

OBJECT ENCODING 返回 listpack 就一定更快吗?

不一定。它通常更节省空间,但具体命令和数据规模决定 CPU 工作量,必须结合访问模式和延迟测试。

为什么同一类 key 的 encoding 不一样?

元素数量、单元素长度、值的类型、配置阈值和 Redis 版本都可能不同。应按 key 的实际数据分布逐个抽样。

能不能手动指定 Redis 的内部编码?

应用不应把内部编码当作稳定 API。可以调整相关配置并重建测试数据,但是否值得要由内存与延迟对照结果决定。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go atomic.Value 如何用统一类型承载可选配置Go atomic.Value 如何用统一类型承载可选配置
上一篇
Go atomic.Value 如何用统一类型承载可选配置
SkildArt AI商品图预算怎么定?按SKU、场景数与渠道版本估算整批投入
下一篇
SkildArt AI商品图预算怎么定?按SKU、场景数与渠道版本估算整批投入
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之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模型性能。
    23次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    126次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    51次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    21次使用
  • OpenCompass大模型评测体系详解:功能、使用指南与应用场景
    OpenCompass
    OpenCompass是上海AI实验室推出的开源大模型评测平台,提供CompassKit、CompassHub和CompassRank三大核心组件,支持LLM及多模态模型的一站式标准化评估与排行榜查询。
    74次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码