【问题标题】:delete cache by prefix in apc / memcache / eaccelerator在 apc / memcache / eaccelerator 中按前缀删除缓存
【发布时间】:2011-06-14 16:24:48
【问题描述】:

假设我将这些变量保存在 apc、memcached 和 eaccelerator 中:

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

如何删除所有以article_3_ 开头的缓存变量(最多可达 10000 个)?

有没有办法列出缓存的变量?

【问题讨论】:

    标签: php memcached apc eaccelerator


    【解决方案1】:

    缓慢的解决方案

    对于 APC:

    $iterator = new APCIterator('user', '#^article_3_#', APC_ITER_KEY);
    foreach($iterator as $entry_name) {
        apc_delete($entry_name);
    }
    

    对于加速器:

    foreach(eaccelerator_list_keys() as $name => $infos) {
        if (preg_match('#^article_3_#', $name)) {
            eaccelerator_rm($name);
        }
    }
    

    对于memcached,看@rik's answer

    正确的解决方案

    一次使多个键过期的一般解决方案是命名它们。为了使它们过期,您只需更改命名空间:

    假设您有一组键“article_3_1”,“article_3_2”,...。您可以这样存储它们:

    $ns = apc_fetch('article_3_namespace');
    apc_store($ns."_article_3_1", $value);
    apc_store($ns."_article_3_2", $value);
    

    像这样获取它们:

    $ns = apc_fetch('article_3_namespace');
    apc_fetch($ns."_article_3_1");
    

    通过增加命名空间使它们全部失效:

    apc_inc('article_3_namespace');
    

    【讨论】:

    • +1 用于 APCIterator,尽管它确实需要 APC 3.1.1 或更高版本
    • 嗨,APCIterator "user" 中的第一个参数是什么?我在手册中找不到任何关于它的信息!
    • 表示用户缓存条目;用户缓存条目是apc_store()等设置的变量。该参数的另一个可能值是file;文件缓存条目是缓存的脚本。
    【解决方案2】:

    虽然文档说 APCIterator 在 apc >= 3.1.1 中可用,但我在几个声称拥有 apc 3.1.9 的系统上,但是没有 APCIterator 存在。如果您没有 APCIterator 供您使用,请试一试:

    $aCacheInfo = apc_cache_info('user');
    
    foreach($aCacheInfo['cache_list'] as $_aCacheInfo)
        if(strpos($_aCacheInfo['info'], 'key_prefix:') === 0)
            apc_delete($_aCacheInfo['info']);
    

    在本例中,我们正在检查键中的前缀,但您可以使用 preg_match 等。 al 并实现更接近 APCIterator 提供的东西。

    【讨论】:

      【解决方案3】:

      【讨论】:

        【解决方案4】:

        如果有可能使用 memcached 的替代方案,scache 支持结构化键空间。有了它,您可以将数据存储到嵌套路径:

        scache_shset($conn, 'article/1/0', $data10);
        scache_shset($conn, 'article/3/0', $data30);
        scache_shset($conn, 'article/3/1', $data31);
        

        并最终通过删除父节点来销毁数据

        scache_shunset($conn, 'article/3');
        

        【讨论】:

          【解决方案5】:

          有一个 APCIterator 可以帮助您搜索 APC 中的键。 实例化 APCIterator。

          APCIterator::valid() 表示仍有键需要迭代。 APCIterator::key() 返回 apc 密钥。 APCIterator::next() 将迭代器位置移动到下一项。

          // APC
          $iterator = new APCIterator('user', '/^article_3_/');
          
          while($iterator->valid()) {
               apc_delete($iterator->key());
               // You can view the info for this APC cache value and so on by using 
               // $iterator->current() which is array
               $iterator->next();
          }
          

          对于memcache,您可以使用MemcachedgetAllKeys 方法

          // Memcached 
          $m = new Memcached();
          $m->addServer('mem1.domain.com', 11211);
          
          $items = $m->getAllKeys();
          
          foreach($items as $item) {
              if(preg_match('#^article_3_#', $item)) {
                  $m->delete($item);
              }
          }  
          

          【讨论】:

          • 除了代码之外,最好给出一些解释。
          • 另外,请回答完整的问题。您错过了 OP 要求的部分 有没有办法列出缓存的变量?
          • 我已经扩展了我的答案。感谢您的反馈:)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-30
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          • 2019-09-17
          • 2021-11-02
          • 2017-02-10
          相关资源
          最近更新 更多