2011-04-28 13 views
6

empecé a usar Zend Cache (APC backend) y todo está bien en términos de la devolución de valores almacenados en caché en lugar de golpear la base de datos cada vez. Sin embargo, aquí está mi problema:Patrones para despejar Zend Cache

$cache_key = 'getrebates_'.$operator_code; 

if(PP_Model_CacheService::exists($cache_key)) { 
    $cached_values = PP_Model_CacheService::load($cache_key); 
} else { 
    //hits the db  
    $cached_values = $this->getAll($operator_code); 
    PP_Model_CacheService::save($cached_values, $cache_key); 
} 
return $cached_values; 

Cada operador tiene sus propios descuentos que varían entre los operadores, ahora si cambio de la base de datos y la necesidad de aclarar las rebajas para todos los operadores, ¿cómo voy a hacer esto?

Puedo usar $ Cache-> clean(), pero eso borrará los otros cachés (no solo el caché de reembolsos para cada operador). Si recorro todos los operadores:

foreach($operator_codes AS $operator_code) { 
    $cache_key = 'getrebates_'.$operator_code; 
    $cache->delete($cache_key) 
} 

Parece mucho trabajo para la memoria caché. ¿Hay alguna manera de borrar solo una sección de Caché?

//Something like: 
$section_key = 'getrebates'; 
$Cache[$section_key][$operator_code]; 
$Cache->clearSection($section_key); 

¿Hay alguna estructura de matriz en la memoria caché de APC o está todo basado en la clave de caché?

Respuesta

10

Puede aplicar etiquetas a los valores almacenados en la memoria caché. De esta forma, puede eliminar fácilmente todas las entradas de caché que tienen una determinada etiqueta.

$cache->save($huge_data, 'myUniqueID', array('tagA', 'tagB')); 

// clear all cache entries with tag tagA or tagC 
$cache->clean(
    Zend_Cache::CLEANING_MODE_MATCHING_TAG, 
    array('tagA', 'tagC') 
); 

Consulte esta página: http://framework.zend.com/manual/en/zend.cache.theory.html y la API para obtener detalles sobre el método de limpieza de Zend_Cache_Core: http://framework.zend.com/apidoc/1.11/

+2

excepción de APC ... – regilero

+0

Gracias por su tiempo de Duke. Como se indica en regilero a continuación, APC no admite etiquetas. ¿Qué back-end usaría en este caso para soportar etiquetas? –

+0

¿Cuántas entradas de caché estamos hablando? Si es 10 o 20, simplemente eliminaría cada entrada. Dependiendo de sus necesidades usted podría considerar el ahorro de una matriz asociativa serializado en la memoria caché en lugar de entradas individuales. Esta no es una buena idea si tiene que actualizar/eliminar entradas individuales a menudo a través de – theduke

4

@theduke es correcto, el etiquetado es la forma correcta de hacerlo, a excepción de APC, como Zend_Cache_Backend_Apc no admite el etiquetado. De the doc:

CUIDADO: con este backend, "tags" no son compatibles por el momento

Y desde su último comentario que SEMS está utilizando APC como backend. Entonces, ¿extiende esta clase y agrega el comportamiento de la etiqueta (agregando una sintaxis especial en el identificador de etiqueta? Manejando la asignación de entrada de la etiqueta vs caché en otro lugar ?, en una entrada de caché de largo plazo?), O decide usar otra caché backend.

+0

¿Qué backend admite etiquetas? Parece que la mayoría de los backends no lo hacen desde el Manual de Zend –

+0

de http://framework.zend.com/manual/en/zend.cache.backends.html se puede ver las etiquetas están disponibles para backend archivo, SQLite y backend parcialmente en ZendPlatform. – regilero