Redis 密钥大小是否还包括该密钥的数据大小或仅包括密钥本身?

Does redis key size also include the data size for that key or just the key itself?

我正在尝试分析 redis 数据库的数据库大小并根据几篇文章调整我们的数据存储,例如 https://davidcel.is/posts/the-story-of-my-redis-database/https://engineering.instagram.com/storing-hundreds-of-millions-of-simple-key-value-pairs-in-redis-1091ae80f74c

我已阅读有关 "key sizes"(即 https://redis.io/commands/object)的文档

并尝试了 运行 各种工具,例如:

redis-cli --bigkeys

并且还尝试读取 redis-cli 的输出:

INFO memory

我不清楚尺寸语义。

报告的大小是否 反映了密钥 本身 的大小,即如果我的密钥是“abc ”且值为“value1”报告的大小是针对 "abc" 部分?还有关于该键的复杂数据结构(例如哈希/数组或列表)的相同问题。

反复试验似乎没有给我一个明确的结果。

不同的工具给出不同的答案。

首先阅读 --bigkeys - 它报告键 space 中的大值大小,不包括键名采用的 space。请注意,在这种情况下,值的大小对每种数据类型都有不同的含义,即字符串的大小由它们的 STRLEN(字节)决定,而所有其他值的大小由其嵌套元素的数量决定。

所以这基本上意味着它几乎没有给出实际使用情况的指示,而是按照预期的方式进行 - 找到大键(不是大键名,只有估计的大值)。

INFO MEMORY 是另一回事。 used_memory 以字节为单位报告,反映了键名、它们的值以及内部数据结构的所有相关开销的整个 RAM 消耗。

还有 DEBUG OBJECT 但请注意,它的输出不是衡量 Redis 中键的内存消耗的可靠方法 - serializedlength 字段以持久化对象所需的字节为单位给出,不是内存中的实际占用空间,它包括数据本身之上的各种管理开销。

最后,从 v4 开始,我们有 MEMORY USAGE 命令做得更好 - 有关详细信息,请参阅 https://github.com/antirez/redis-doc/pull/851