Redis:列表的内存优化

Redis: Memory optimization for lists

提问人:Paulo Neves 提问时间:5/3/2016 更新时间:5/3/2016 访问量:456

问:

我正在尝试优化列表的内存使用。在阅读了这篇很棒的内存优化文章后,我强制使用 ziplists 来看看它的效果,但即使我的 RDB 减少了 70%,Redis 消耗的内存也几乎没有减少......

以下是有关我的实例的一些数据:

# Memory
used_memory:28894160544
used_memory_human:26.91G
used_memory_rss:29423480832
used_memory_peak:28894160544
used_memory_peak_human:26.91G
used_memory_lua:33792
mem_fragmentation_ratio:1.02
mem_allocator:jemalloc-3.6.0

# Keyspace
db0:keys=8433742,expires=0,avg_ttl=0
  • RDB 文件为 18GB
  • 从这些 ~8.5M 键中,~6M 是一些仅占用 700 MB 内存的控制键(我删除了所有列表一次以检查这一点)
  • 其余对象 (~2.5M) 是包含 1 到 75 个项目(以及一些最多包含 500 个项目的旧列表)对应于 ~26 GB 的列表
  • 每个项目都是一个 JSON 对象(小于 1 KB)

然后,我应用了这些设置:

list-max-ziplist-entries 1000
list-max-ziplist-value 10000

(我知道这些很高,可能很危险......我只是想保证涵盖每个列表......大多数列表有 75 个项目(我会强制他们保持这个大小),每个项目少于 1000 字节)

结果是:

# Memory
used_memory:26486158232
used_memory_human:24.67G
used_memory_rss:26687750144
used_memory_peak:26553209288
used_memory_peak_human:24.73G
used_memory_lua:33792
mem_fragmentation_ratio:1.01
mem_allocator:jemalloc-3.6.0
  • 如您所见,内存减少约 2.2GB8.3%)
  • 在此配置下运行 BGSAVE 后,我的 RDB 文件有 5 GB(减少的 72%)

此外,我在之前和之后调试了一些列表,看看它们发生了什么......以下是一些示例:

清单 A (75 项):

- Before:
Value at:0x7f0ab6b04940 refcount:1 encoding:linkedlist serializedlength:29332 lru:0 lru_seconds_idle:2623116
- After:
Value at:0x7f9b8a464920 refcount:1 encoding:ziplist serializedlength:8151 lru:0 lru_seconds_idle:2623697

清单B(56项):

- Before:
Value at:0x7f0e62d83270 refcount:1 encoding:linkedlist serializedlength:28797 lru:0 lru_seconds_idle:2623201
- After:
Value at:0x7f9ee1b9dfa0 refcount:1 encoding:ziplist serializedlength:4438 lru:0 lru_seconds_idle:2623692

清单C(15项):

- Before:
Value at:0x7f0c8fbdcfb0 refcount:1 encoding:linkedlist serializedlength:1160 lru:0 lru_seconds_idle:2623249
- After:
Value at:0x7f9d3852d330 refcount:1 encoding:ziplist serializedlength:720 lru:0 lru_seconds_idle:2623675

这分别给了我 72%85% 和 38% 的对象减少

除了我想要的,所有东西都占用了更少的内存,这是 Redis :( 消耗的总内存


所以我主要有 3 个问题:

  1. ziplists 如何压缩如此多的 RDB 文件,而 RAM 使用量却如此之少?
  2. DEBUG 对象中的 serializedlength 到底是多少?它是否仅反映 RDB 中的大小?该密钥从我正在运行的实例中消耗了多少内存呢?
  3. 这是我能从ziplist中得到的最多,还是我遗漏了什么?我还能做什么(除了压缩列表项中的 JSON 数据)。我不明白 ziplists 如何对序列化如此有效,但对 Redis 内存占用几乎没有帮助
列出 内存 优化 Redis

评论


答: 暂无答案