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

注意:在当前版本中,从容器中删除值不会释放容器的 分配的内存。

为本页评分
返回顶部 ↑