Redis:列表的内存优化

Pau*_*ves 6 memory optimization list redis

我正在尝试优化列表的内存使用情况.看完这个伟大的内存优化的文章我强迫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
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)

(我知道,这些都是高可能是危险的......我只是想保证覆盖所有列表...大多数列表有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
Run Code Online (Sandbox Code Playgroud)
  • 如您所见,内存减少约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
Run Code Online (Sandbox Code Playgroud)

清单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
Run Code Online (Sandbox Code Playgroud)

列表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
Run Code Online (Sandbox Code Playgroud)

这使我分别减少了72%,85%和38%的物体

除了我想要的东西外,一切都减少了很少的内存,这是Redis消耗的总内存:(


所以我主要有3个问题:

  1. ziplists如何压缩RDB文件,但RAM使用量如此之少?
  2. DEBUG OBJECT中的序列化长度究竟是什么?它只反映RDB中的大小吗?那个密钥从我运行的实例消耗了多少内存呢?
  3. 这是我从拉链列表中获取的最多,还是我错过了什么?我还能做什么(除了压缩列表项中的JSON数据).我不知道ziplists如何对序列化如此有效,但对Redis内存占用的帮助很小