登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  Redis

Redis MEMORY USAGE 怎样估算键的内存占用

来源:17golang原创

时间:2026-10-26 01:53:21 220浏览 收藏

用MEMORY USAGE key可以取得Redis为这个键及其值分配的内存字节数,包含相关管理开销。对于嵌套数据结构,它可能通过采样估算总量;SAMPLES控制样本数量,默认5,0表示遍历全部嵌套值。生产排查应先用有限采样定位候选,再决定是否值得扩大采样。

官方地址:https://redis.io/

明确要量的是键还是整个进程

例如订单详情缓存只保存几百字节JSON,MEMORY USAGE返回值仍可能更大。键名、对象表示、内部结构和分配器带来的开销都使“业务字节数”与“内存分配”不同。不要把该命令当成JSON长度统计器,也不要用某台机器测得的常数给所有键套公式。

问题观察对象不能直接推导的内容
哪个缓存键更占空间MEMORY USAGE整个进程的RSS
字符串内容有多长STRLEN对象和键名的全部开销
实例内存为何增长INFO memory、MEMORY STATS某个业务键独占的全部进程成本
业务数据与单键内存分配范围结构说明图
结构说明图:单键内存包含值及相关管理分配,进程还有其他内存对象;不是运行截图。

跨版本、不同位数、分配器和内部编码比较时,需要记录环境差异。即使业务字段完全一致,也不能假定返回字节数一致。

在受控连接中读取单键字节数

在已有认证和TLS配置的redis-cli连接方式上查询已知键,不要为排查把服务暴露到公网。下面假设本地测试实例使用6379端口、0号库,示例没有创建数据或执行真实请求:

# 数据库选择影响查询对象;生产连接沿用已有认证与TLS配置。
redis-cli -p 6379 -n 0 TYPE 'cache:order:681'
redis-cli -p 6379 -n 0 MEMORY USAGE 'cache:order:681'
# PTTL辅助判断该键是否很快过期,不改变过期时间。
redis-cli -p 6379 -n 0 PTTL 'cache:order:681'

返回整数的单位是字节。键不存在时返回空值,不能把空值写成“占用0字节”。TYPE、内存查询和PTTL是不同命令,期间键可能过期、被删除或重建,因此不要把三条结果描述成同一时刻的原子快照。

集群环境需使用能够路由单键请求的连接或客户端;redis-cli可按部署方式启用-c处理重定向。Redis Cluster使用0号库,不能照搬独立实例中的非零数据库参数。

按集合规模选择采样数量

对大型哈希、列表等嵌套结构,有限样本会影响估算精度。元素大小相近时小样本有参考价值;少数超长字段混在大量短字段中时,小样本可能不足以代表总体。增加样本不改变业务数据,但会增加服务端工作量。

# 先取有限样本,用于候选键的初步估算。
redis-cli -p 6379 -n 0 MEMORY USAGE 'cache:order:681' SAMPLES 20
# 仅在允许的低峰窗口,对已评估规模的单个候选遍历全部嵌套值。
redis-cli -p 6379 -n 0 MEMORY USAGE 'cache:order:681' SAMPLES 0

SAMPLES 0不是“零采样、立即返回”,而是全部取样。全量遍历也不等于操作系统级精确测量;它改变嵌套值的采样范围,命令仍报告Redis内部的内存分配口径。紧凑编码等实现细节也会影响采样选项带来的实际差异。

有限采样与全部嵌套值的范围关系结构说明图
结构说明图:少量样本属于嵌套值集合,全部取样覆盖该集合;没有表示真实运行耗时或测量结果。

连接超时不保证服务端立即停止该次遍历。对未知规模的键,先确认业务边界与规模信息,再决定是否做全量测量,不能以客户端超时设置代替服务端工作预算。

限定权限和采集范围

MEMORY USAGE属于只读但可能较慢的诊断命令。采集账号只获得所需子命令及指定业务键范围,不应为了它直接授予全部管理命令。Redis ACL可按子命令授权,具体规则由管理员结合实际版本、既有用户权限和部署策略配置;只读并不代表没有延迟影响。

批量采集优先使用业务侧提供的少量候选键,避免直接KEYS遍历整个实例。如果确需SCAN发现候选,限定目标前缀、总键数、执行时段和命令频率。SCAN的COUNT是工作量提示而不是严格批量上限;扫描可能返回重复键,采集器需按预算处理,不能把重复记录反复加总。

监控记录键名时注意其中是否包含个人标识。常规日志可只保存业务类型和脱敏标识,保留样本参数、采集时间、节点与数据库即可。权限拒绝、连接超时应记录为错误,不能归入“键不存在”。

记录结果并判断优化是否有效

每次记录键类型、字节数、SAMPLES参数、时间及Redis环境。比较改造前后时保持样本参数一致,并尽量使用相近的数据规模。若删除了字段但占用没有线性下降,应考虑分配档位和内部编码变化,而不是立即断言命令失效。

假设某键返回1048576字节,可按1024换算为1024 KiB或1 MiB;这是单位换算示例,不是本次实测。抽查十个大键的和只代表这十个观测对象,不能直接推算整个实例或容器预算。复制缓冲、客户端缓冲、分配器保留内存等仍需结合实例指标解释。

为什么和DUMP得到的长度不一样?

DUMP是序列化表示,MEMORY USAGE是内存分配口径,两者用途不同。

为什么增加SAMPLES后数值改变?

嵌套值大小分布不均以及查询间的数据变化都可能影响结果。先保持数据条件和参数一致,再讨论差异。

为什么删键后RSS没马上下降?

释放对象与分配器将内存归还操作系统不是同一过程;应结合MEMORY STATS和INFO memory看实例整体,而不能据此否认单键查询。

官方资料:MEMORY USAGE参数与返回值、MEMORY STATS实例内存指标。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>