2010-08-06 35 views
14

Soy bastante nuevo en las estrategias e implementaciones de caché. Estoy trabajando en un proyecto que será intensivo en la base de datos, pero también tengo información que se actualiza y cambia muy regularmente.Estrategia de almacenamiento en caché, ¿cuándo el almacenamiento en caché se vuelve inútil?

que he encontrado suficiente información para saber en general, la forma de desarrollar la función de almacenamiento en caché, pero lo que estoy seguro es de la estrategia general.

Si cacheamos todos los resultados de la consulta y agruparlos por cosas lógicas que puedo claras sobre los factores desencadenantes que tengan sentido, probablemente a tener decenas de miles (al menos) diminutos archivos en mi caché. ¿Tendría más sentido guardar en caché solo los resultados de consultas grandes?

Sé que esto es una cuestión de hardware algo específico, pero en términos generales en qué volumen de almacenamiento en caché los archivos no se convierta en algo sin sentido? Es decir, si está cargando el sistema de archivos con todos estos archivos diminutos, ¿el acceso a ellos eventualmente se vuelve lo suficientemente lento como para que no haya almacenado en caché la información para empezar?

Gracias a todos, estoy interesado en las opiniones que tienen que ofrecer

EDIT: En base a las respuestas con respecto a este ser absolutamente aplicación específica, Permítanme plantear la pregunta de esta manera que debe ser universal:

Suponiendo que tengo una aplicación que depende de una tabla con 1,000,000 de elementos en ella ...

¿Sería más rápido hacer una consulta para recuperar uno de esos elementos directamente de la base de datos o para recuperar uno de esos elementos? desde mi directorio de caché con 1,000,000 de archivos, cada uno con los detalles de uno de ellos e artículos?

EDIT: Al parecer, 100.000 no fue suficiente para obtener una respuesta válida, vamos a hacer que 1.000.000. ¿Alguien quiere ir por 1,000,000,000? Porque puedo hacerlo ...

+3

Como usted está pidiendo las opiniones de las personas y ninguna solución es mejor que otra (al menos no sin especificar sus requisitos y su caso de uso), puede considerar cambiar esto a una 'wiki de la comunidad'. – mikegreenberg

+0

@Michael - Mi caso de uso o requisitos no son tan específicos. Solo estoy preguntando, si empiezo a almacenar cada pequeña información en los archivos, ¿en algún momento el volumen puro de archivos degrada la ganancia de rendimiento del almacenamiento en caché en primer lugar? – Chris

+0

Mysql debe y puede funcionar extremadamente rápido en volúmenes tan pequeños como 100k filas. Así que tienes suficiente reserva de rendimiento para no convertirte en caché-maníaco. – zerkms

Respuesta

2

La regla general es: no almacenar en caché si bien no es necesario y sólo caché las cosas que necesitan ser almacenado en caché.

+4

¿Es esa una manera de decir en caché, hacer que funcione primero, y luego preocuparse por lo rápido que es? –

+0

Ok. Así que lo convertiré en una opción y solo lo encenderé cuando las cosas empiecen a ralentizarse. :) Pero, ¿es posible guardar en la memoria caché tantas cosas que no mejora el rendimiento o lo degrada? – Chris

+4

** NUNCA ** caché porque su aplicación es lenta. Esa es una receta para el desastre. Caché porque tiene demasiada carga (lo que significa demasiadas solicitudes concurrentes). Pero si su aplicación es lenta sin caché, agregue que solo está colocando una curita en una herida de bala ... Si es lenta, arregle la lentitud ... – ircmaxell

10

Utilice la memoria caché de consultas integrada de MySQL en lugar de tratar de mantenerla usted mismo. Automáticamente eliminará las consultas en caché de las tablas cuando se escriban en ellas. Además, funciona en la memoria lo que debe ser muy eficiente ...

Además, no se limite a las consultas de caché. Intente almacenar en caché segmentos completos de la aplicación en diferentes etapas del ciclo de renderizado. De modo que puede dejar que MySQL guarde en caché las consultas, luego puede almacenar en caché cada vista individual (renderizada), cada bloque individual y cada página. Luego, puede elegir si desea o no extraer de la memoria caché en función de la solicitud.

Por ejemplo, un usuario que no ha iniciado sesión puede obtener la página completa directamente desde el caché. Pero un usuario conectado no puede (debido a un nombre de usuario, etc.). Entonces, para él, es posible que pueda representar 1/2 de sus visitas en la página desde el caché (ya que no dependen del objeto del usuario). Aún así obtiene el beneficio del almacenamiento en caché, pero estará escalonado según las necesidades.

Si realmente está esperando mucho tráfico, definitivamente vale la pena investigar Memcached. Deje MySQL almacenar sus consultas para usted, y luego almacenar todos los elementos de la caché de usuario-tierra en Memcache ...

Editar: para responder a su edición:

sistemas de ficheros puede llegar a ser lento si un único directorio crece grande.Siempre y cuando esté "espaciando nombres" por directorio (por lo que cada directorio solo tiene una pequeña porción de archivos de caché), debería estar bien desde ese punto de vista. En cuanto al umbral exacto, realmente dependerá de su hardware y sistema de archivos más que cualquier otra cosa. Sé que EXT3 se vuelve bastante lento si hay una carga de archivos en un único directorio (tengo directorios con literalmente cientos de miles de archivos, y puede tomar hasta medio segundo simplemente stat() uno de los archivos, y mucho menos hacer cualquier tipo de listado de directorio) ...

Pero tenga en cuenta que si agrega otro servidor, tendrá duplicación de caché (lo cual no es bueno) o tendrá que volver a escribir todo el caché capa. ¿Hay alguna razón para no ir con Memcached desde el principio?

EDIT 2: Para responder a su última edición:

Es todavía demasiado dura para llamar. Tengo una aplicación que tiene una base de datos con alrededor de 1,5 mil millones de filas (que crece alrededor de 500 mil por día). No usamos ningún almacenamiento en caché porque no tenemos problemas de concurrencia. E incluso si lo hiciéramos, sería mejor lanzar más servidores MySQL en lugar de agregar caché, ya que cualquier forma de caché tendría un índice de aciertos tan bajo que no valdría la pena el tiempo de desarrollo para agregarlo.

Y esa es la razón por la que soy tan inflexible sobre no almacenar en caché la velocidad. Siempre habrá un objeto que no está en caché. Entonces, si golpeas una página con uno de esos objetos, todavía necesita ser rápido. Como regla general, trato de guardar en caché todo lo que se accederá de nuevo en los próximos minutos (de todos modos, me quedan unos 5 minutos de producción en otras aplicaciones). Entonces, si los ítems no obtienen más que unos pocos aciertos en ese lapso de tiempo, o la tasa de aciertos es muy baja (menos del 90%), no me preocupo por el caché de ese ítem ...

+0

Gracias. Eso era exactamente por lo que sentía curiosidad. – Chris

0

Esto es tanto depende del hardware y de la aplicación. Debe realizar pruebas comparativas para determinar el umbral en el que la indexación del sistema operativo pasa a ser mayor que la duración de almacenamiento/recuperación de datos (tanto en el nivel de MySQL como en el nivel de acceso al archivo en caché). Y también necesita comparar eso con el umbral aceptable (muy subjetivo) de su audiencia.

Cuestiones relacionadas