Pregunta

Tengo una granja de servidores, cada servidor está haciendo regularmente una consulta idéntica a la base de datos. Estos resultados de la consulta se almacenan en una memoria caché compartida, accesible a todos los servidores.

¿Cómo puedo estar seguro de que una consulta más reciente no recibe sobrescrito por una consulta más viejo? ¿Hay alguna forma de control de versiones de las consultas de alguna manera, por el tiempo, por ejemplo, por lo que este no sucede? ¿Cómo lidiar con consultas simultáneas?

Gracias!

Editar: db es SQL Server. Consulta es una instrucción de selección. Y, el almacenamiento en caché mecanismo es muy simple: escritura sencilla, sin bloqueo. Y es que actualmente no hay forma de saber el orden de las consultas de selección.

¿Fue útil?

Solución

Un enfoque es tener un contador de actualización global en la base de datos, ya sea para actualizaciones o para lecturas (actualizaciones es más eficiente, sino también más difícil de conseguir derecha).

Así que en cada actualización, también se incrementa el contador global. En cada lectura, leer el contador global, y poner los datos en la memoria caché, junto con el valor del contador. Sólo sobrescribir el contenido de caché si el valor del contador es mayor.

Debido al aislamiento de base de datos, las transacciones deben aparecer como si llegan de una manera en serie (suponiendo que haya elegido el nivel de aislamiento SERIALIZABLE). Eso, a su vez, significa que números del contador estrictamente superiores se relacionan con los datos más recientes.

Otros consejos

¿Dónde está la memoria caché? Es un archivo de disco? O una tabla en la base de datos?

Y ¿qué quiere decir cuando se dice una consulta mayor podría sobrescribir uno nuevo? No es cierto que la consulta más recientemente completado-(o tal vez el más recientemente iniciaron-) es el más reciente?

Se debe bloquear el contenedor caché antes de realizar cada consulta, ya sea un archivo o una mesa. Cada servidor sólo debe realizar la consulta si puede obtener el bloqueo, de lo contrario, debe esperar a que el recurso bloqueado. De esta forma el caché contendrá sólo los resultados más recientes.

Es que en la línea de lo que están pidiendo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top