Eliminar caché por prefijo en APC / MEMCACHE / EACCELERATOR
-
24-10-2019 - |
Pregunta
Supongamos que tengo estas variables guardadas en APC, Memcached y Eaccelerator:
article_1_0
article_1_1
article_3_2
article_3_3
article_2_4
¿Cómo puedo eliminar todas las variables almacenadas en caché que comienzan con article_3_
(pueden llegar hasta 10000)?
¿Hay alguna forma de enumerar las variables en caché?
Solución
La solución lenta
Para APC:
$iterator = new APCIterator('user', '#^article_3_#', APC_ITER_KEY);
foreach($iterator as $entry_name) {
apc_delete($entry_name);
}
Para Eaccelerator:
foreach(eaccelerator_list_keys() as $name => $infos) {
if (preg_match('#^article_3_#', $name)) {
eaccelerator_rm($name);
}
}
Para Memcached, mira La respuesta de @Rik
La solución adecuada
La solución general para expirar múltiples claves a la vez es el espacio de nombres. Para expirarlos, solo tiene que cambiar el espacio de nombres:
Digamos que tiene un grupo de claves "Artículo_3_1", "Artículo_3_2", ... puede almacenarlas así:
$ns = apc_fetch('article_3_namespace');
apc_store($ns."_article_3_1", $value);
apc_store($ns."_article_3_2", $value);
Buscarlos así:
$ns = apc_fetch('article_3_namespace');
apc_fetch($ns."_article_3_1");
Y expirarlos a todos simplemente incrementando el espacio de nombres:
apc_inc('article_3_namespace');
Otros consejos
Aunque los documentos dicen que Apciterator está disponible en APC> = 3.1.1, estoy en varios sistemas que afirman tener APC 3.1.9, sin embargo, no hay APCiterator presente. Si no tiene apciterator a su disposición, dale un giro a algo así:
$aCacheInfo = apc_cache_info('user');
foreach($aCacheInfo['cache_list'] as $_aCacheInfo)
if(strpos($_aCacheInfo['info'], 'key_prefix:') === 0)
apc_delete($_aCacheInfo['info']);
En este ejemplo, estamos revisando un prefijo en la clave, pero podría usar PreG_Match ET. Al y lograr algo más cercano a lo que proporciona Apciterator.
Hay una forma de recuperar todas las claves de Memcache Pero es muy caro.
Si existe la posibilidad de usar alternativas para Memcached, scache Admite espacios de teclas estructurados. Con él podría almacenar datos en rutas anidadas:
scache_shset($conn, 'article/1/0', $data10);
scache_shset($conn, 'article/3/0', $data30);
scache_shset($conn, 'article/3/1', $data31);
y finalmente destruir datos eliminando el nodo principal
scache_shunset($conn, 'article/3');
Hay un apciterator que lo ayuda a buscar a través de las claves en APC. Instanciar el apciterator.
Apciterator :: válido () significa que todavía hay claves para iterar el canal. Apciterator :: key () le devuelve la tecla APC. Apciterator :: next () mueve la posición de iterador al siguiente elemento.
// 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();
}
Para Memcache puedes usar Memcached y use Getallkeys método
// 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);
}
}