Удалить кэш с помощью префикса в APC / MEMCACHE / EACCELERATOR
-
24-10-2019 - |
Вопрос
Давайте предположим, что у меня есть эти переменные, сохраненные в 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);
}
Для eaccelerator:
foreach(eaccelerator_list_keys() as $name => $infos) {
if (preg_match('#^article_3_#', $name)) {
eaccelerator_rm($name);
}
}
Для Memcached, посмотрите на @Ответ Рика
Правильное решение
Общее решение для истечения нескольких клавиш одновременно - это пространство имен. Для истечения их, вам просто нужно изменить пространство имен:
Скажем, у вас есть группа ключей "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. Если в вашем распоряжении нет точки зрения, дайте что -то подобное вихрь:
$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_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');
Существует проситератор, который помогает вам искать ключи в APC. Создать экземпляры APCITERATOR.
Apciterator :: vaility () означает, что есть клавиши, которые все еще находятся в перевод. 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);
}
}