redis - Redis key 大小是否还包括该 key 的数据大小或仅包括 key 本身?

标签 redis redis-cluster redis-cli

我正在尝试分析 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 大小”(即 https://redis.io/commands/object)的文档

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

redis-cli --bigkeys

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

INFO memory

我不清楚尺寸语义。

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

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

最佳答案

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

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

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

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

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

最后,从 v4 开始,我们的 MEMORY USAGE 命令做得更好 - 请参阅 https://github.com/antirez/redis-doc/pull/851了解详情。

关于redis - Redis key 大小是否还包括该 key 的数据大小或仅包括 key 本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47159010/

相关文章:

python - 构建处理 redis 和 cache_method 装饰器的测试

javascript - 在 Node 中使用 lua 脚本扫描按键

php - 一次处理更多插入的想法

node.js - Redis 集群 : will hgetall search all nodes in cluster for key?

node.js - 与单个 Redis channel 相比,使用 Redis channel 的成本是多少

ubuntu - 等待集群加入....永远不会结束 redis-trib.rb Redis 3.2.9

ruby-on-rails - ruby 和 Redis : set a timeout for subscribtions

redis - 使用 redis 和 nodejs 进行搜索、排序和分页列表的最佳方法是什么?

shell - 在redis中加载文件时,在值中插入了一个新行,如何避免这种情况

redis - 如何在redis-cli中查看解码后的消息包数据