Redis 是个内存全集的 kv 数据库,不存在部分数据在磁盘部分数据在内存里的情况,所以提前预估和节约内存非常重要。本文将以最常用的 string 和 zipmap 两类数据结构在 jemalloc 内存分配器下的内存容量预估和节约内存的方法.阿Test:百万up主的涨粉秘诀
先说说 jemalloc, 传说中解决 firefox 内存问题 freebsd 的默认 malloc 分配器,area,thread-cache 功能和 tmalloc 非常的相识。在 2.4 版本被 Redis 引入,在antirez 的博文
中 提到内节约 30% 的内存使用。相比 glibc 的 malloc 需要在每个内存外附加一个额外的 4 字节内存块,jemalloc 可以通过 je_malloc_usable_size 函数获得指针实际指向的内存大小,这样 Redis 里的每个 key 或者 value 都可以节约 4 个字节,不少阿.
下面是 jemalloc size class categories, 左边是用户申请内存范围,右边是实际申请的内存大小。这张表后面会用到.
1 - 4 size class:4 5 - 8 size class:8 9 - 16 size class:16 17 - 32 size class:32 33 - 48 size class:48 49 - 64 size class:64 65 - 80 size class:80 81 - 96 size class:96 97 - 112 size class:112 113 - 128 size class:128 129 - 192 size class:192 193 - 256 size class:256 257 - 320 size class:320 321 - 384 size class:384 385 - 448 size class:448 449 - 512 size class:512 513 - 768 size class:768 769 - 1024 size class:1024 1025 - 1280 size class:1280 1281 - 1536 siz