2009-06-03 12 views
10

estoy actualmente en el proceso de construcción de un repositorio para un proyecto que va a ser intensivo DB (pruebas de rendimiento se han llevado a cabo y es necesario el almacenamiento en caché de ahí por qué estoy pidiendo)estrategia de caché de datos consultados

El La forma en que lo configuro ahora es que cada objeto se almacena en caché individualmente, si quiero hacer una consulta para ellos, paso la consulta a la base de datos y devuelvo el ID requerido. (Para algunas consultas simples, he guardado en caché y administro los identificadores)

Luego, presiono el caché con estos identificadores y los saco, los objetos que faltan se agrupan en la instrucción "where in" y se activan en la base de datos; en este punto, repobulo el caché con los identificadores faltantes.

La mayoría de las consultas que se hacen es acerca de la búsqueda/ordenamiento de los datos.

¿Es esta una estrategia adecuada? ¿O quizás hay mejores técnicas disponibles?

Respuesta

9

Este es un enfoque razonable y he seguido esta ruta antes y lo mejor es usar esto para el almacenamiento en caché simple.

Sin embargo, cuando esté actualizando o escribiendo en la base de datos se encontrará con algunos problemas interesantes y debe manejar estos escenarios cuidadosamente.

Por ejemplo, los datos de su caché quedarán obsoletos si el usuario actualiza el registro en la base de datos. En ese escenario, deberá actualizar simultáneamente el caché en memoria o purgar el caché para que se pueda actualizar en la siguiente consulta de búsqueda.

Las cosas también pueden ser complicadas si, por ejemplo, el usuario actualiza la dirección de correo electrónico de un cliente que está en una tabla separada pero asociada a través de una clave externa.

Además del almacenamiento en caché de la base de datos, también debería considerar el almacenamiento en caché de resultados. Esto funciona bastante bien si, por ejemplo, tiene una tabla que muestra los datos de ventas del mes anterior. La tabla se puede almacenar en otro archivo que se incluye en un montón de otras páginas que quieren mostrar la tabla. Ahora, si almacena en caché el archivo con la tabla de datos de ventas, esas otras páginas cuando solicitan este archivo, el motor de almacenamiento en caché puede obtenerlo directamente del disco y la capa de lógica de negocios ni siquiera recibe el golpe. Esto no es aplicable todo el tiempo, pero es bastante útil para controles personalizados.

Unidad de patrón de trabajo

También ayuda a saber sobre el patrón Unit of Work.

Cuando usted está tirando de datos dentro y fuera de una base de datos, es importante mantener un seguimiento de lo que ha cambiado; de lo contrario, esos datos no se escribirán de nuevo en la base de datos. Del mismo modo, tiene que insertar nuevos objetos que cree y eliminar los objetos que elimine.

Usted puede cambiar la base de datos con cada cambio en el modelo de objetos, pero esto puede dar lugar a un montón de muy pequeñas llamadas base de datos, que termina siendo muy lento.Además, requiere que tenga una transacción abierta para la interacción completa , que es poco práctico si tiene una transacción comercial que abarca múltiples solicitudes . La situación es aún peor si necesita realizar un seguimiento de los objetos que ha leído para poder evitar las lecturas inconsistentes .

A Unit of Work realiza un seguimiento de todo lo que hace durante una transacción de negocio que puede afectar a la base de datos . Cuando haya terminado, figura en todo lo que debe hacerse para modificar la base de datos como resultado de su trabajo .

+1

Cuando los datos se actualiza la memoria caché se actualiza, y también actualiza la tabla. He utilizado el patrón de repositorio en este proyecto y todo el acceso a los datos es a través de este exclusivamente. El repositorio en sí mismo siempre golpea el caché y luego db (si el caché está vacío o se están actualizando los datos) – TWith2Sugars

+0

Si aún no lo ha hecho y si opción está disponible para usted, ¿por qué no considerar un ORM? – aleemb

1

No aconsejo la estrategia de caché personalizada. El almacenamiento en caché es difícil. De acuerdo con su plataforma de elección, es posible que desee elegir una biblioteca/herramienta de almacenamiento en caché de terceros.

2

Si está utilizando SQL Server, puede utilizar SqlCacheDependency donde se vuelve a llenar automáticamente su caché cuando los cambios en la tabla de datos en la base de datos. Aquí está el enlace para SqlCacheDependency

Este enlace contiene una similar cache dependency solution. (Es un archivo en lugar de una base de datos. Usted tendrá que hacer algunos cambios como por el enlace de MSDN anterior para tener una dependencia de caché en la DB)

Espero que esto ayude :)

Cuestiones relacionadas