удалить кеш с помощью префикса в apc / memcache / eaccelerator

Предположим, что у меня есть эти переменные, сохраненные в apc, memcached и 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); } 

Для ускорителя:

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

Для memcached, посмотрите на ответ @ rik

Правильное решение

Общее решение для истечения нескольких ключей одновременно – это пространство имён. Для их завершения вам просто нужно изменить пространство имен:

Скажем, у вас есть группа ключей «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'); 

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

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

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

Существует 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

 // 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); } }