解决redis内存不够的问题

为天地立心,为生民立命,为前圣继绝学,为万世开太平。
今天遇到了一个问题
1
2
Predis \ Response \ ServerException
ERR Error running script (call to f_a08c9c69b7c07ae2485190873b90d128a23e502d): @user_script:1: @user_script: 1: -OOM command not allowed when used memory > 'maxmemory'.
谷歌了一下, 发现是Redis内存不够导致的, 遂开始我的修复之旅
  • 连接上redis

    1
    /usr/local/redis/bin/redis-cli
  • 查看内存信息

    1
    info memory
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    used_memory:461709952
    used_memory_human:440.32M
    used_memory_rss:521863168
    used_memory_rss_human:497.69M
    used_memory_peak:461915512
    used_memory_peak_human:440.52M
    used_memory_peak_perc:99.96%
    used_memory_overhead:2811662
    used_memory_startup:786656
    used_memory_dataset:458898290
    used_memory_dataset_perc:99.56%
    total_system_memory:3722543104
    total_system_memory_human:3.47G
    used_memory_lua:47104
    used_memory_lua_human:46.00K
    maxmemory:843000000
    maxmemory_human:803.95M
    maxmemory_policy:noeviction
    mem_fragmentation_ratio:1.13
    mem_allocator:jemalloc-4.0.3
    active_defrag_running:0
    lazyfree_pending_objects:0
  • 编辑配置文件

    1
    vi /usr/local/redis/etc/redis.conf
  • 根据你机器的配置适当的修改

    1
    maxmemory 2gb
  • 修改redis存储策略
    默认的redis设置是非常保守的,即内存超限后就不在存储,可以把策略修改为LRU算法(最近最少使用算法)——新存储的信息会替换掉旧的信息,从而不会是内存越线,修改redis.conf。这个必须结合业务场景,如果没有自动加载数据到redis的缓存机制,会造成数据缺少。我觉得可以往这方面靠,能最大利用资源。

    1
    maxmemory-policy volatile-lru
  • 重启redis

    1
    2
    3
    4
    5
    6
    7
    redis-cli -h 127.0.0.1 -p 6379 shutdown

    #加上`&`号使redis以后台程序方式运行
    ./redis-server &

    #启动时指定配置文件
    redis-server ./redis.conf