为什么在del键的一半时redis内存使用不会减少

问题描述 投票:17回答:2

Redis用于保存数据,但它占用大量内存,内存使用率高达52.5%。我在redis中删除了一半的密钥,删除操作的返回代码没问题,但其内存使用率没有降低。

什么原因?提前致谢。

我的操作代码如下:

// save data
m_pReply = (redisReply *)redisCommand(m_pCntxt, "set %b %b", mykey.data(), mykey.size(), &myval, sizeof(myval));
// del data
m_pReply = (redisReply *)redisCommand(m_pCntxt, "del %b", mykey.data(), mykey.size());

redis信息:

redis 127.0.0.1:6979> info
redis_version:2.4.8
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.6
process_id:28799
uptime_in_seconds:1289592
uptime_in_days:14
lru_clock:127925
used_cpu_sys:148455.30
used_cpu_user:38023.92
used_cpu_sys_children:23187.60
used_cpu_user_children:123989.72
connected_clients:22
connected_slaves:0
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:31903334872
used_memory_human:29.71G
used_memory_rss:34414981120
used_memory_peak:34015653264
used_memory_peak_human:31.68G
mem_fragmentation_ratio:1.08
mem_allocator:jemalloc-2.2.5
loading:0
aof_enabled:0
changes_since_last_save:177467
bgsave_in_progress:0
last_save_time:1343456339
bgrewriteaof_in_progress:0
total_connections_received:820
total_commands_processed:2412759064
expired_keys:0
evicted_keys:0
keyspace_hits:994257907
keyspace_misses:32760132
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:11672476
vm_enabled:0
role:slave
master_host:192.168.252.103
master_port:6479
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
db0:keys=66372158,expires=0
memory-management redis
2个回答
12
投票

请参阅以下链接中的内存分配部分:

http://redis.io/topics/memory-optimization

我在这里引用它:

删除密钥时,Redis不会总是释放(返回)内存到操作系统。这对Redis来说并不是特别之处,但它是大多数malloc()实现的工作方式。例如,如果您使用5GB的数据填充实例,然后删除相当于2GB的数据,则Resident Set Size(也称为RSS,即进程占用的内存页数)可能仍然是大约5GB,即使Redis声称用户内存大约为3GB。发生这种情况是因为底层分配器无法轻松释放内存。例如,通常大多数删除的密钥与仍然存在的其他密钥分配在相同的页面中。


3
投票

从Redis 4.0.0开始,有一个命令:

MEMORY PURGE

应该做的伎俩:https://redis.io/commands/memory-purge

但请注意,命令docs表示:

此命令当前仅在使用jemalloc作为分配器时实现,并为所有其他命令评估为良性NOOP。

the README提醒我们:

默认情况下,Redis是针对libc malloc编译和链接的,除了jemalloc是Linux系统上的默认设置。选择此默认值是因为jemalloc已证明比libc malloc具有更少的碎片问题。

© www.soinside.com 2019 - 2024. All rights reserved.