为什么Redis的内存使用量没有减少,当按键德尔一半(why does the redis memo

2019-06-26 14:48发布

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

Answer 1:

请参阅内存分配节以下链接:

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

我引用在这里:

Redis的不会(返程)内存总是释放到OS密钥将被删除时。 这不是关于Redis的一些特别的东西,但它是最malloc()函数的实现是如何工作的。 例如,如果你充满了5GB价值数据的一个实例,然后删除2GB数据相当于中,驻留集大小(也被称为RSS,这是由过程消耗的内存页面的数量)将可能仍然是5GB左右,即使Redis的会声称用户内存为3GB左右。 这是因为底层的分配不能轻易释放内存。 例如经常大多数取出钥匙在同一页作为仍然存在其它按键被分配。



Answer 2:

由于Redis的4.0.0有这个命令:

MEMORY PURGE

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

但是请注意,命令文档状态:

使用jemalloc作为一个allocator时,此命令目前只实现,计算结果为良性NOOP为所有其他人。

和自述提醒我们:

Redis的编译,默认情况下对libc中的malloc挂钩,与jemalloc的是Linux系统默认的例外。 此默认被选中,因为jemalloc已被证明比libc中的malloc较少的碎片化问题。



文章来源: why does the redis memory usage not reduce when del half of keys