我正在尝试分析 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/