Redis JSON RAM 使用情况
调试内存消耗
Redis 中的每个键都会占用内存,并且至少需要 RAM 量来存储键名称,因为 以及 Redis 使用的一些每个键开销。最重要的是,键中的值还需要 公羊。
Redis JSON 在反序列化 JSON 值后将其存储为二进制数据。这种表示通常更多
昂贵,就大小而言,比序列化形式更昂贵。JSON 数据类型至少使用 24 个字节 (在
64 位架构),这可以通过使用JSON.DEBUG MEMORY
命令:
127.0.0.1:6379> JSON.SET emptystring . '""'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY emptystring
(integer) 24
此 RAM 要求对于所有标量值都是相同的,但字符串需要额外的空间 取决于它们的实际长度。例如,一个 3 个字符的字符串将使用 3 个额外的字节:
127.0.0.1:6379> JSON.SET foo . '"bar"'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY foo
(integer) 27
空容器占用 32 个字节来设置:
127.0.0.1:6379> JSON.SET arr . '[]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY arr
(integer) 32
127.0.0.1:6379> JSON.SET obj . '{}'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY obj
(integer) 32
容器的实际大小是其中所有项目的大小之和,加上它自己的 开销。为避免昂贵的内存重新分配,容器的容量按 2 的倍数进行扩展 直到达到 treshold 大小,它们从中按固定块增长。
具有单个标量的容器分别由 32 字节和 24 字节组成:
127.0.0.1:6379> JSON.SET arr . '[""]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY arr
(integer) 56
具有两个标量的容器需要 40 个字节的容器(每个指针指向 container 为 8 字节),值为 2 * 24 字节:
127.0.0.1:6379> JSON.SET arr . '["", ""]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY arr
(integer) 88
一个 3 项(每 24 字节)的容器将被分配 4 个项目的容量,即 56 字节:
127.0.0.1:6379> JSON.SET arr . '["", "", ""]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY arr
(integer) 128
下一项不需要在容器中进行分配,因此使用量只会增加该分配 scalar 的要求,但另一个值将再次缩放容器:
127.0.0.1:6379> JSON.SET arr . '["", "", "", ""]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY arr
(integer) 152
127.0.0.1:6379> JSON.SET arr . '["", "", "", "", ""]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY arr
(integer) 208
下表给出了磁盘上一些测试文件的大小(以字节为单位),以及使用 JSON 的 JSON 格式。MessagePack 列仅供参考,反映值的长度 使用 MessagePack 存储时。
文件 | 文件大小 | Redis JSON | 消息包 |
---|---|---|---|
/tests/files/pass-100.json | 380 | 1079 | 140 |
/tests/files/pass-jsonsl-1.json | 1441 | 3666 | 753 |
/tests/files/pass-json-parser-0000.json | 3468 | 7209 | 2393 |
/tests/files/pass-jsonsl-yahoo2.json | 18446 | 37469 | 16869 |
/tests/files/pass-jsonsl-yelp.json | 39491 | 75341 | 35469 |
注意:在当前版本中,从容器中删除值不会释放容器的 分配的内存。