我一直试图清除我的内存缓存,因为我注意到在使用ps -aux
时存储占用了近30%的服务器内存。
所以我运行了以下php代码。
$memcache = new Memcache; $memcache->connect("localhost",11211); $memcache->flush(); print_r($memcache->getStats());
这导致
的输出(
[pid] => 4936
[uptime] => 27318915
[time] => 1255318611
[version] => 1.2.2
[pointer_size] => 64
[rusage_user] => 9.659531
[rusage_system] => 49.770433
[curr_items] => 57864
[total_items] => 128246
[bytes] => 1931734247
[curr_connections] => 1
[total_connections] => 128488
[connection_structures] => 17
[cmd_get] => 170288
[cmd_set] => 128246
[get_hits] => 45464
[get_misses] => 124824
[evictions] => 1009
[bytes_read] => 5607431213
[bytes_written] => 1806543589
[limit_maxbytes] => 2147483648
[threads] => 1
)
这应该是相当基本的,但很明显,我遗漏了一些东西。
答案 0 :(得分:16)
您确实需要更改memcached设置,以便它不会耗尽尽可能多的内存。启动memcached时,可以使用-m
标志向其传递应使用的内存量(以兆字节为单位)。有关信息,请参阅its documentation。
flush
只是使缓存中的所有项无效,它不会命令memcached取消分配或取消保存它正在使用的内存。我怀疑你可以命令memcached取消分配正在使用的内存。
答案 1 :(得分:12)
科林 Flush All命令使缓存将所有到期时间设置为当前。 对现有密钥的下一个请求将不返回任何内容,并且将从缓存中删除该记录。 Memcached没有单独的进程来清理过期的项目,并使用“懒惰”方法,这使得该过程非常轻量和高效。因此,如果您需要实际删除缓存并从头开始,唯一真正的方法是重新启动Memcached。一个很长的解决方法是转储所有密钥,发送Flush All命令,然后遍历每个运行get对它的密钥,导致记录被删除。不是100%确定这种方法是否有效但理论上听起来似乎有道理。
答案 2 :(得分:2)
清除memcached后,您需要等待至少1秒钟。否则添加不到一秒的项目将使自己无效。
例如:
$memcache->flush();
$time = time()+1; //one second future
while(time() < $time) {
//sleep
}
$memcache->set('key', 'value'); // repopulate the cache
请看这篇文章memcache flush issue
答案 3 :(得分:0)
实际上,释放所有值的最简单方法是重新启动memcached实例。
答案 4 :(得分:-5)
试试这个
法师::应用程序() - &GT; getCacheInstance() - &GT; getFrontend() - &GT; getBackend() - &GT;清洁(::调用Zend_Cache CLEANING_MODE_ALL);