2012-07-28 67 views
11

redis用於保存數據,但會花費大量內存,其內存使用率高達52.5%。 我刪除了redis中的一半密鑰,並且刪除操作的返回代碼正常,但其內存使用量並未減少。爲什麼redis內存使用量在del鍵的一半時不會減少

是什麼原因?提前致謝。

我的操作代碼如下:

// 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 
+1

不幸的是,您必須重新啓動redis服務器進程。看看http://stackoverflow.com/a/5994981/1089294 – underley 2012-07-28 21:19:57

+0

系統正在運行,我無法重新啓動它。也許你是對的,redis del key並非真正免費的malloc。 – hupantingxue 2012-07-31 02:34:05

回答

11

請參閱內存分配節以下鏈接:

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

我在這裏引用它:

刪除密鑰 後,Redis並不總是將內存釋放(返回)到操作系統。這對Redis來說並不是特別的,但它是大多數malloc()實現的工作原理。例如,如果您使用5GB的數據填充實例 ,然後刪除相當於2GB的數據,則駐留組大小(也稱爲RSS,即進程佔用的內存頁數 )將大概仍然在5GB左右,即使Redis會聲稱用戶內存在3GB左右。這個 發生是因爲底層分配器無法輕鬆釋放內存。例如,大多數被移除的密鑰通常在 中與其他仍然存在的密鑰分配在相同的頁面中。

+0

感謝您的支持。那麼這個'解決方案'是redis的重啓嗎? – 2015-01-26 11:44:52

+1

@stevejalim,我這麼認爲,但我不確定是否有任何可配置的方式來釋放分配的內存。 – 2015-04-15 18:47:19

+0

@SteveJalim如果你發現你的設置總是有很多密鑰被創建和刪除,我建議編譯一個使用內存分配器的redis版本,該分配器具有更好的分片避免功能,比如jemalloc。它不會釋放已分配的內存,但它有助於進一步減少內存使用量。 – 2016-09-22 14:12:35

相關問題