如何在Redis中调试错误“在使用内存时不允许OOM命令>'maxmemory'”?

时间:2013-08-25 15:00:11

标签: redis

尝试设置密钥时,我收到“OOM命令不被允许”, 使用maxmemory“volatile-lru”将maxmemory-policy设置为500M,我为发送到redis的每个密钥设置了TTL。

INFO命令返回:used_memory_human:809.22M

  1. 如果maxmemory设置为500M,我怎么达到809M?
  2. INFO命令没有显示任何Keyspace,怎么可能?
  3. KEYS *返回“(空列表或设置)”,我尝试更改数据库编号,仍然没有找到密钥。
  4. 这是info命令输出:

    redis-cli -p 6380
    redis 127.0.0.1:6380> info
    # Server
    redis_version:2.6.4
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_mode:standalone
    os:Linux 2.6.32-358.14.1.el6.x86_64 x86_64
    arch_bits:64
    multiplexing_api:epoll
    gcc_version:4.4.7
    process_id:28291
    run_id:229a2ee688bdbf677eaed24620102e7060725350
    tcp_port:6380
    uptime_in_seconds:1492488
    uptime_in_days:17
    lru_clock:1429357
    
    # Clients
    connected_clients:1
    client_longest_output_list:0
    client_biggest_input_buf:0
    blocked_clients:0
    
    # Memory
    used_memory:848529904
    used_memory_human:809.22M
    used_memory_rss:863551488
    used_memory_peak:848529192
    used_memory_peak_human:809.22M
    used_memory_lua:31744
    mem_fragmentation_ratio:1.02
    mem_allocator:jemalloc-3.0.0
    
    # Persistence
    loading:0
    rdb_changes_since_last_save:0
    rdb_bgsave_in_progress:0
    rdb_last_save_time:1375949883
    rdb_last_bgsave_status:ok
    rdb_last_bgsave_time_sec:-1
    rdb_current_bgsave_time_sec:-1
    aof_enabled:0
    aof_rewrite_in_progress:0
    aof_rewrite_scheduled:0
    aof_last_rewrite_time_sec:-1
    aof_current_rewrite_time_sec:-1
    aof_last_bgrewrite_status:ok
    
    # Stats
    total_connections_received:3
    total_commands_processed:8
    instantaneous_ops_per_sec:0
    rejected_connections:0
    expired_keys:0
    evicted_keys:0
    keyspace_hits:0
    keyspace_misses:0
    pubsub_channels:0
    pubsub_patterns:0
    latest_fork_usec:0
    
    # Replication
    role:master
    connected_slaves:0
    
    # CPU
    used_cpu_sys:18577.25
    used_cpu_user:1376055.38
    used_cpu_sys_children:0.00
    used_cpu_user_children:0.00
    
    # Keyspace
    redis 127.0.0.1:6380>
    

7 个答案:

答案 0 :(得分:11)

如果非易失性密钥已使用maxmemory限制,则Redis的maxmemory volatile-lru策略可能无法释放足够的内存。

答案 1 :(得分:10)

您是否有机会更改数据库的数量?如果使用非常大的数字,则初始内存使用量可能很高

答案 2 :(得分:0)

在配置中控制内存。因此,您的实例受限制。您可以查看redis.conf或从CLI工具发出“config get maxmemory”来获取限制。

如果您管理此Redis实例,则需要咨询并调整配置文件。通常在/etc/redis.conf或/etc/redis/redis.conf中查找。

如果您使用的是Redis提供商,则需要与他们联系以增加限额。

答案 3 :(得分:0)

在我们的案例中,maxmemory设置为较高的金额,然后团队成员在数据存储后将其更改为较低的金额。

答案 4 :(得分:0)

对于此类问题,请考虑在redis.conf文件中增加maxmemory。 它帮助了我。

像maxmemory对我来说是2100万,然后我把它改为31000000。希望它有所帮助。

答案 5 :(得分:0)

要调试此问题,需要检查您对redis-cli手动执行了什么操作或在代码中的某处执行了操作。

  1. 您可能运行了*键,而您的内存却很少,无法容纳此命令消耗的内存。这导致节流缓存服务。
  2. 在代码中,所做的更改可能会影响键的插入以及db中的重复数据或唯一数据,这会导致系统中的整体内存超出。

答案 6 :(得分:0)

我的问题是旧数据没有被释放,这导致redis数据库被快速阻塞。 在Python中,我通过运行清除了缓存服务器

red = redis.StrictRedis(...)
red.flushdb()

然后,通过使用“ ex”保存文件将ttl限制为24h:

red.set(<FILENAME>, png, ex=(60*60*24))