假设我将这些变量保存在APC中,模仿和Eaccelerator中:

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

我如何删除所有以开始的缓存变量 article_3_ (他们最多可以达到10000)?

有什么方法可以列出缓存变量?

有帮助吗?

解决方案

缓慢的解决方案

对于APC:

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

对于Eaccelerator:

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

对于备忘录,请看 @rik的答案

适当的解决方案

立即到期多个键的一般解决方案是命名它们。为了到期,您只需要更改名称空间:

假设您有一组键“ preste_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');

其他提示

尽管文档说APCITERATOR在APC> = 3.1.1中可用,但我使用的是几个声称具有APC 3.1.9的系统,但是没有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 ET。 Al并实现更接近Apciterator提供的东西。

从memcache检索所有键的一种方法 但这非常昂贵。

如果有可能使用替代方案进行备忘录, 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');

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

apciterator ::有效()表示仍有键迭代槽。 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,您可以使用 备忘录 并使用 Getallkeys 方法

// 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);
    }
}  
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top