2011-02-02 31 views
8

Realmente no tengo ninguna experiencia con el almacenamiento en caché en absoluto, por lo que esto puede parecer una pregunta estúpida, pero ¿cómo saber cuándo almacenar en caché sus datos? Ni siquiera fui capaz de encontrar un sitio que hablara sobre esto, pero ¿pueden ser solo mis habilidades de búsqueda o quizás demasiadas variables para considerar?PHP APC ¿Guardar en caché o no?

Probablemente esté usando APC. ¿Alguien tiene algún ejemplo de lo que sería la menor cantidad de datos que necesitaría para almacenarlo en caché? Por ejemplo, supongamos que tiene una matriz con 100 elementos y utiliza un bucle foreach y realiza una manipulación simple de la matriz, ¿debería almacenar en caché el resultado? ¿Qué tal si tuviera 1000 artículos, 10000 artículos, etc.?

¿Debería estar almacenando los resultados de la búsqueda en la base de datos? ¿Qué tipo de consultas debe almacenar en caché? Supongo que un simple seleccionar y tal vez un par de instrucciones se une a un DB mysql no necesita el almacenamiento en caché, ¿o sí? Suponiendo que la caché de consultas de mysql está activada, ¿eso significa que no necesita almacenar en caché la capa de la aplicación, o debería hacerlo todavía?

Si crea una instancia de un objeto, ¿debería almacenarlo en caché? ¿Cómo determinar si se debe almacenar en caché o no? Así que una guía general sobre qué almacenar en caché sería agradable, los ejemplos también serían realmente útiles, gracias.

Respuesta

10

Cuando busque datos de almacenamiento en caché que se leyeron desde la base de datos en APC/memcache/WinCache/redis/etc, debe tener en cuenta que no se actualizarán cuando la base de datos se actualice a menos que codifique explícitamente mantener la base de datos y el caché sincronizados Por lo tanto, el almacenamiento en caché es más efectivo cuando los datos de la base de datos no cambian con frecuencia, pero también requiere una consulta más compleja y costosa para recuperar esos datos de la base de datos (de lo contrario, puede leerlos de la base de datos cuando lo necesito) ... costosas consultas de unión que devuelven los mismos registros de datos cuando se ejecutan son los principales candidatos. Y siempre pruebe para ver si las consultas se leen más rápido desde la base de datos que desde la caché. Corregir la indexación de la base de datos puede mejorar enormemente los tiempos de acceso a la base de datos, especialmente porque la mayoría de las bases de datos también mantienen su propio caché interno, así que no use APC o datos de caché equivalentes a menos que los gastos generales de la base lo justifiquen.

También debe tener en cuenta el uso de espacio en la memoria caché. La mayoría de las memorias caché son de tamaño fijo y no desea sobrellenarlas ... por lo tanto, no las use para almacenar grandes volúmenes de datos. Utilice el script apc.php disponible con APC para controlar el uso del caché (aunque asegúrese de que no sea públicamente accesible para cualquiera y todos los que accedan a su sitio ... mala seguridad).

Al mantener objetos en la caché, el objeto se serializará() cuando se almacena y se deserializará() cuando se recupere, por lo que hay una sobrecarga. Los objetos con atributos de recursos perderán ese recurso; así que no almacene sus objetos de acceso a la base de datos.

Es sensato usar únicamente la memoria caché para almacenar información a la que acceden muchos/todos los usuarios, en lugar de datos específicos del usuario. Para la información de la sesión del usuario, adhiérase a las sesiones normales de PHP.

+4

@Joker Solo como un pequeño complemento, en caso de que no lo sepa, APC proporciona 2 tipos de caché, un caché de código de operación utilizado por php internamente para 'hacerlo más rápido' y el caché de usuario que puede usar para almacenar datos. El caché de usuario es parte que vas a necesitar aquí. (me disculpo si esto le está enseñando a la gente a chupar huevos, pero espero que pueda serle útil a otros que se crucen con esta pregunta) –

+0

Sí, soy consciente de que el caché del código de operación funciona automáticamente si tiene una APC habilitada. Cuando dice que debe probar para ver si las consultas se leen más rápidamente desde la base de datos o el caché, ¿cómo podría probar esto? ¿Y cuándo debería almacenar en caché los datos normales? Por ejemplo, mi ejemplo de bucle foreach. – Joker

+0

@Joker: la forma de probar es probarlo (utilizando ambos métodos) y medir los tiempos ... no hay cálculos absolutos que puedan indicarle con anticipación, aunque usar EXPLAIN en las consultas de su base de datos puede dar algunas pistas. Recuerde que siempre debe garantizar los mejores índices en su base de datos de todos modos. Tampoco existe una regla "dura y rápida" para su ejemplo de bucle ... es algo que debe evaluarse caso por caso. Todo lo que puedo decir es "no almacenar en caché solo por el almacenamiento en caché", solo hazlo cuando haya un beneficio real y cuantificable. –

0

La respuesta simple es que almacena datos en caché cuando las cosas se vuelven lentas. Obviamente para cualquier aplicación de tamaño mediano a grande, necesita hacer mucha más planificación que simplemente un enfoque de esperar y ver. Pero para la gran mayoría de los sitios web que existen, la pregunta que debes hacerte es "¿Estás contento con el tiempo de carga"? Por supuesto, si eres obsesivo con el tiempo de carga, como yo, querrás intentar hacerlo aún más rápido independientemente.

A continuación, debe identificar cuál es específicamente la causa de la lentitud. Suponía que el código de la aplicación era la fuente, pero vale la pena examinarlo si hay otros factores externos, como un gran tamaño de archivo de página, solicitudes excesivas, no gzip, etc. Use un sitio como http://tools.pingdom.com/ o una extensión como yslow como inicio. (Consejo rápido, asegúrese de que keepalives y gzip estén funcionando).

Suponiendo que el problema es la duración de la ejecución del código de su aplicación, va a querer perfilar su código con algo como xdebug (http://www.xdebug.org/) y ver la salida con kcachegrind o wincachegrind . Eso le permitirá saber qué partes de su código tardan en ejecutarse. A partir de ahí, tomará decisiones sobre qué almacenar en caché y cómo almacenarlo en caché (o realizar mejoras en la lógica de su código).

Hay tantas posibilidades para lo que podría ser el problema y las soluciones asociadas, que no vale la pena adivinar. Entonces, una vez que identifique el problema, es posible que desee publicar una nueva pregunta relacionada con la resolución de ese problema específico. Diré que si no se usa correctamente, la caché de consultas de mysql puede ser contraproducente. Además, generalmente evito el caché de usuario de APC a favor de memcached.

Cuestiones relacionadas