«

redis异常: OOM command not allowed when used memory > 'maxmemory'

时间:2023-3-13 14:35     作者:wen     分类: 数据库


某天程序突然出现异常,部分功能能正常使用,部分功能出现异常,并显示错误信息如下:
redis:OOM command not allowed when used memory > ‘maxmemory’

  1. 链接到Redis
    [root@esc ~]# redis-cli
    127.0.0.1:6379> 

如果有密码, 用auth 你的密码登陆

  1. 查看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"
  2. 设置最大内存, 我的是4G改为6G

    127.0.0.1:6379> config set maxmemory 6G
    OK

发现实际redis使用的内存已经超过分配给redis的最大内存
到此,问题已经很明显了,处理方式有很多种,比如:

  1. 扩展redis的最大内存
  2. 优化redis,完善消息过期机制,定期自动清理一些过期的key
  3. 设置驱逐策略 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 命令可以正常执行;
比较容易混淆的有两个:

标签: redis