удалить кеш по префиксу в apc / memcache / eaccelerator - PullRequest
4 голосов
/ 24 января 2011

Предположим, у меня есть эти переменные, сохраненные в apc, memcached и eaccelerator:

  • article_1_0
  • article_1_1
  • article_3_2
  • article_3_3
  • article_2_4

Как удалить все кэшированные переменные, которые начинаются с article_3_ (они могут достигать 10000)?

есть ли способ перечислить кэшированные переменные?

Ответы [ 5 ]

11 голосов
/ 24 января 2011

Медленное решение

Для БТР:

$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');
2 голосов
/ 07 ноября 2011

Хотя в документах говорится, что 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 et. и достичь чего-то более близкого к тому, что предоставляет APCIterator.

1 голос
/ 02 декабря 2014

Существует 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 вы можете использовать Memcached и использовать getAllKeys method

// 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);
    }
}  
1 голос
/ 14 сентября 2011

Если есть возможность использовать альтернативы для 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');
1 голос
/ 24 января 2011

Существует способ извлечь все ключи из memcache , но это очень дорого.

...