首页 > 解决方案 > 已用内存大于redis中的最大内存

问题描述

我已将4 G的maxmemory 设置为 redis 服务器,并将驱逐策略设置为volatile-lru。目前它正在使用大约4.41G的内存。我不知道这怎么可能。由于设置了驱逐策略,因此它应该在内存达到最大内存时立即开始驱逐键。我在集群模式下运行 redis,配置为 3 个主服务器,复制因子为 1。这仅发生在一个从属 redis 上。

的输出

redis-cli info memory

是 :-

# Memory
used_memory:4734647320
used_memory_human:4.41G
used_memory_rss:4837548032
used_memory_rss_human:4.51G
used_memory_peak:4928818072
used_memory_peak_human:4.59G
used_memory_peak_perc:96.06%
used_memory_overhead:2323825684
used_memory_startup:1463072
used_memory_dataset:2410821636
used_memory_dataset_perc:50.93%
allocator_allocated:4734678320
allocator_active:4773904384
allocator_resident:4844134400
total_system_memory:32891367424
total_system_memory_human:30.63G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:4294967296
maxmemory_human:4.00G
maxmemory_policy:volatile-lru
allocator_frag_ratio:1.01
allocator_frag_bytes:39226064
allocator_rss_ratio:1.01
allocator_rss_bytes:70230016
rss_overhead_ratio:1.00
rss_overhead_bytes:-6586368
mem_fragmentation_ratio:1.02
mem_fragmentation_bytes:102920560
mem_not_counted_for_evict:0
mem_replication_backlog:1048576
mem_clients_slaves:0
mem_clients_normal:1926964
mem_aof_buffer:0
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0

标签: redis

解决方案


重要的是要了解驱逐过程的工作方式如下:

  1. 客户端运行新命令,导致添加更多数据。
  2. Redis 检查内存使用情况,如果大于 maxmemory 限制,它会根据策略驱逐键。
  3. 执行新命令,依此类推。

所以我们不断地越过内存限制的边界,越过它,然后通过驱逐键返回到限制之下。如果某个命令导致在一段时间内使用大量内存(例如存储到新键中的大集合交集),则内存限制可能会被明显超过。

参考:https ://redis.io/topics/lru-cache


推荐阅读