Redis:列表的内存优化

时间:2016-05-03 02:23:58

标签: list memory optimization redis

我正在尝试优化列表的内存使用量。在阅读了这个great memory optimization article之后,我强迫使用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.2GB 8.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

LIST 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 OBJECT中的序列化长度是多少?它只反映RDB中的大小吗?那个密钥从我正在运行的实例消耗了多少内存呢?
  3. 这是我从拉链列表中获取的最多,还是我错过了什么?我还能做什么(除了压缩列表项中的JSON数据)。我不知道ziplists如何有效地进行序列化,但对Redis内存占用的帮助很小

0 个答案:

没有答案