redis异常: OOM command not allowed when used memory > 'maxmemory'
时间:2023-3-13 14:35 作者:wen 分类: 数据库
某天程序突然出现异常,部分功能能正常使用,部分功能出现异常,并显示错误信息如下:
redis:OOM command not allowed when used memory > ‘maxmemory’
- 链接到Redis
[root@esc ~]# redis-cli 127.0.0.1:6379>
如果有密码, 用auth 你的密码
登陆
-
查看redis内存信息
127.0.0.1:6379> info memory # Memory used_memory:4294971192 used_memory_human:4.00G used_memory_rss:4464369664 used_memory_rss_human:4.16G used_memory_peak:4295217816 used_memory_peak_human:4.00G used_memory_peak_perc:99.99% used_memory_overhead:2872910 used_memory_startup:765744 used_memory_dataset:4292098282 used_memory_dataset_perc:99.95% total_system_memory:33668079616 total_system_memory_human:31.36G used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:4294967296 maxmemory_human:4.00G maxmemory_policy:noeviction mem_fragmentation_ratio:1.04 mem_allocator:jemalloc-4.0.3 active_defrag_running:0 lazyfree_pending_objects:0 127.0.0.1:6379> config get maxmemory 1) "maxmemory" 2) "4294967296"
-
设置最大内存, 我的是4G改为6G
127.0.0.1:6379> config set maxmemory 6G OK
发现实际redis使用的内存已经超过分配给redis的最大内存
到此,问题已经很明显了,处理方式有很多种,比如:
- 扩展redis的最大内存
- 优化redis,完善消息过期机制,定期自动清理一些过期的key
- 设置驱逐策略
config set maxmemory-policy allkeys-lru
, 优先删除最近最少使用的key
当现有内存大于 maxmemory 时,便会触发 redis 主动淘汰内存方式,通过设置 maxmemory-policy
有如下几种淘汰方式:
volatile-lru
:设置了过期时间的 key 使用 LRU 算法淘汰;
allkeys-lru
:所有 key 使用 LRU 算法淘汰;
volatile-lfu
:设置了过期时间的 key 使用 LFU 算法淘汰;
allkeys-lfu
:所有 key 使用 LFU 算法淘汰;
volatile-random
:设置了过期时间的 key 使用随机淘汰;
allkeys-random
:所有 key 使用随机淘汰;
volatile-ttl
:设置了过期时间的 key 根据过期时间淘汰,越早过期越早淘汰;
noeviction
:默认策略,当内存达到设置的最大值时,所有申请内存的操作都会报错 (如 set,lpush 等),只读操作如 get 命令可以正常执行;
比较容易混淆的有两个:
-
LRU(Least Recently Used),最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
-
LFU(Least Frequently Used),最少频率使用。会统计每个 key 的访问频率,值越小淘汰优先级越高。
标签: redis