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

“如何调试错误”;使用内存时不允许使用OOM命令>';maxmemory'&引用;在Redis?,redis,Redis,当我试图设置一个键时,我得到了“OOM命令不允许”, maxmemory使用maxmemory策略设置为500M“易失性lru”,我正在为发送到redis的每个键设置TTL INFO命令返回:used\u memory\u human:809.22M 如果maxmemory设置为500M,我是如何达到809M的 INFO命令不显示任何键空间,怎么可能 KEYS*返回“(空列表或集合)”,我已尝试更改数据库编号,但仍然找不到任何键 以下是info命令输出: redis-cli -p 6380 re

当我试图设置一个键时,我得到了“OOM命令不允许”,
maxmemory
使用
maxmemory策略设置为500M
“易失性lru”,我正在为发送到redis的每个键设置TTL

INFO
命令返回:
used\u memory\u human:809.22M

  • 如果maxmemory设置为500M,我是如何达到809M的
  • INFO
    命令不显示任何键空间,怎么可能
  • KEYS*
    返回“(空列表或集合)”,我已尝试更改数据库编号,但仍然找不到任何键
  • 以下是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>
    

    内存在配置中控制。因此,您的实例是有限的。您可以查看redis.conf或通过CLI工具问题“config get maxmemory”获取限制

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


    如果您使用的是Redis提供商,您需要与他们协商增加您的限制。

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

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

    在我们的例子中,maxmemory被设置为高容量,然后,团队中有人在数据已经存储后将其更改为较低的数量。

    要调试此问题,需要检查您在redis cli上手动执行的操作或代码中的某个位置执行的操作

  • 您可能运行了keys*,并且内存非常少,无法容纳此命令所消耗的内存。这将导致对缓存服务的限制
  • 在代码中,您的更改可能会影响数据库中的键插入和重复或唯一数据,这会导致系统中的总体内存超出

  • 我的问题是旧数据没有被释放,这导致redis db很快被阻塞。 在Python中,我通过运行

    red = redis.StrictRedis(...)
    red.flushdb()
    
    然后,通过使用“ex”保存文件,将ttl限制为24小时:

    red.set(,png,ex=(60*60*24))
    
    是的,数据库数被设置为一个较高的数字,在返回到默认数据库值后,内存被释放,错误消失,我回到正轨,非常感谢!“数据库数量”是什么意思?Redis只是一个数据库。除非您谈论的是另一个实例,否则您不能拥有更多。@chloe:查看
    选择
    命令-同时
    配置获取数据库
    将显示您的Redis实例有多少个数据库。这个答案对我非常有用:
    
    red.set(<FILENAME>, png, ex=(60*60*24))