redis - 已用内存大于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 检查内存使用情况,如果大于 maxmemory 限制,它会根据策略驱逐键。
- 执行新命令,依此类推。
所以我们不断地越过内存限制的边界,越过它,然后通过驱逐键返回到限制之下。如果某个命令导致在一段时间内使用大量内存(例如存储到新键中的大集合交集),则内存限制可能会被明显超过。
推荐阅读
- javascript - 将外部 JS 对象馈入 Vue.js 组件
- python-3.x - subprocess.Popen 仅在终端中工作
- react-native - 使用图像和uri动态设置react native的图像源
- php - 自定义字段的 Smarty PHP 多选
- r - 为纵向数据创建时间轴;使用数据变量进行计算
- html - 如何在 AMP-HTML 页面中加载外部页眉和页脚 HTML
- python - Node JS中Python AES加密/解密代码的实现
- android - Exoplayer 缓冲区状态冻结 UI?
- python - 使用 np.where 创建列时出现问题,ArrayType 错误
- python - 使用 GoogleV3 的 Geopy 表示仅在几个请求后就超出了配额