37

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

INFO命令返回:used_memory_human:809.22M

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

这是信息命令输出:

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>
4

6 回答 6

18

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

于 2015-07-24T01:03:05.943 回答
11

你有没有机会改变数据库的数量?如果您使用非常大的数字,那么初始内存使用量可能会很高

于 2013-08-27T06:45:20.887 回答
2

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

于 2016-03-14T14:41:35.560 回答
0

内存在配置中控制。因此,正如它所说,您的实例受到限制。您可以查看您的 redis.conf 或从 CLI 工具问题“config get maxmemory”中获取限制。

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

如果您使用的是 Redis 提供程序,则需要与他们联系以提高您的限制。

于 2013-08-25T18:26:24.493 回答
0

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

  1. 您可能运行了 keys * 并且您的内存非常少,无法容纳此命令消耗的内存。这会导致对缓存服务的限制。
  2. 在代码中,您的更改可能会影响数据库中的密钥插入和重复或唯一数据,这会导致系统中的整体内存超出。
于 2020-09-18T15:37:18.797 回答
0

我的问题是旧数据没有被释放,它导致 redis db 很快被卡住了。在 Python 中,我通过运行清除了缓存服务器

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

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

red.set(<FILENAME>, png, ex=(60*60*24))
于 2020-09-21T17:57:14.820 回答