2009-01-29 10 views
5

Estoy usando memcached con PHP tratando de almacenar en caché para evitar db-reads. Estoy invalidando la memoria caché en una actualización (la aplicación invalida). Pero, los datos obsoletos del caché se están convirtiendo en un gran problema. En su mayoría, esto se debe a errores en la invalidación (invalidación de la clave incorrecta u olvidando invalidar la entrada de la memoria caché en una ACTUALIZACIÓN).¿Cómo detectar y depurar entradas de caché obsoletas?

¿Hay algún buen método para detectar/depurar este tipo de errores durante el desarrollo/producción?

Respuesta

0

Puede usar el control de concurrencia optimista, que implica agregar una columna más a una tabla (ya sea de marca de tiempo o equivalente, o simplemente una simple int) y usarla al hacer actualizaciones. He aquí cómo usted puede utilizarlo (en caso de int llanura ser una "etiqueta de versión"):

update BlogPost set PublishedOn = :publishedOn, VersionTag = VersionTag + 1 
where ID = :id and VersionTag = :versionTag 

Y marca de tiempo asumiendo se actualiza automáticamente por su DBMS, así es como se hace con las marcas de tiempo:

update BlogPost set PublishedOn = :publishedOn 
where ID = :id and Timestamp = :timestamp 
3

Lo mejor que puedes hacer es poner una función de envoltura alrededor de mysql_query. Dentro de eso, solo verifica si la consulta es una actualización o una eliminación en una tabla en caché y analiza las claves que se están cambiando. Esto no tomará mucho tiempo para escribir, es fácil de probar e impedirá que se olvide de nuevo una invalidación de caché.

0

Puede agregar código de depuración (que está deshabilitado durante la producción) en su aplicación, que realiza dos recuperaciones - una de memcached y otra de la base de datos, las compara y arroja una excepción/escribe el error en el archivo de registro si son diferente. De esta forma (con alguna pérdida de rendimiento) puede observar rápidamente los datos antiguos.

Por supuesto, esto puede ser aún más refinada:

  • añadir un campo de marca de tiempo y no un error si las marcas de tiempo están más cerca que un valor definido (tal vez el proceso no ha tenido tiempo para actualizar la caché)
  • Agregue un campo en el DB que especifique el origen de la actualización (script/número de línea). Esto podría ayudar a rastrear la parte que pierde la parte de invalidación de caché
Cuestiones relacionadas