【问题标题】:Memcache won't flush or clear memoryMemcache 不会刷新或清除内存
【发布时间】:2009-10-12 03:43:18
【问题描述】:

我一直在尝试清除我的内存缓存,因为我注意到在使用 ps -aux 时存储占用了几乎 30% 的服务器内存。

所以我运行了以下 php 代码。

$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
)

这应该是相当基本的,但很明显,我遗漏了一些东西。

【问题讨论】:

    标签: php memcached


    【解决方案1】:

    科林, Flush All 命令使缓存将所有过期时间设置为当前时间。 对现有密钥的下一个请求将不返回任何内容,并且该记录将从缓存中删除。 Memcached 没有单独的进程来清理过期项目,并使用“惰性”方法,这使得该进程非常轻量级和高效。因此,如果您需要实际删除缓存并从头开始,实现此目的的唯一真正方法是重新启动 Memcached。一个长期的解决方法是转储所有密钥,发送 Flush All 命令,然后循环遍历每个运行 get 的密钥,导致记录被删除。不能 100% 确定这种方法是否可行,但理论上听起来是合理的。

    【讨论】:

      【解决方案2】:

      您确实需要更改 memcached 设置,以免占用太多内存。当您启动 memcached 时,您可以使用 -m 标志将它应该使用的内存量(以兆字节为单位)传递给它。有关信息,请参阅its documentation

      flush 只是使缓存中的所有项目无效,它不会命令 memcached 释放或取消保留它正在使用的内存。我怀疑你是否可以命令 memcached 释放它正在使用的内存。

      【讨论】:

      • 谢谢詹姆斯。这确实清除了它。我故意给 memcache 大量内存,但显然比需要的多得多。我将使用较低的设置重新启动内存缓存。
      • 不过,这仍然是一个有效的问题。我在一个使用Magento 的memcache 服务器的共享环境中,似乎上述方法不起作用!我没有重新启动服务器的权限,但脏缓存必须在我的网站正常工作之前去,所以我暂时被文件缓存卡住了。
      【解决方案3】:

      清除内存缓存后,您需要等待至少 1 秒。否则添加不到一秒的项目会自动失效。

      例如:

      $memcache->flush();
      
      $time = time()+1; //one second future
      while(time() < $time) {
      //sleep
      }
      $memcache->set('key', 'value'); // repopulate the cache 
      

      看看这个帖子,memcache flush issue

      【讨论】:

      • 这对我有帮助,但你可以使用 sleep(1) 而不是使用 while,这对 cpu 更友好,当然也更具可读性。
      【解决方案4】:

      实际上,释放所有值的最简单方法是重新启动 memcached 实例。

      【讨论】:

      • 这不是一个好主意。如果您有一个非常繁忙的网站,重新启动 memcache 实际上会导致问题。例如,我同时运行一个有 1,000 名访问者的 Wordpress 网站。如果我重新启动 memcache 集群,MySQL 后端无法足够快地提供数据,WordPress 认为它​​是新安装的。如果可能,请始终冲洗。只有在没有其他选择的情况下才重新启动。
      • 同意,你总是要知道你在做什么。
      【解决方案5】:

      试试这个

      Mage::app()->getCacheInstance()->getFrontend()->getBackend()->clean(Zend_Cache::CLEANING_MODE_ALL);

      【讨论】:

        猜你喜欢
        • 2021-05-09
        • 2021-10-05
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        • 2018-08-11
        • 2011-03-14
        • 2017-02-10
        • 1970-01-01
        相关资源
        最近更新 更多