Pregunta

Según tengo entendido, cada uno de estos métodos: get () y put () son atómicos.

Pero, al acceder a cachés como ehcache & amp; memcached, de manera CheckThenAct , surgirán condiciones de carrera.

¿Qué debemos sincronizar para asegurarnos de que si thread1 hace un Get () y thread2 hace un Get () seguido de un Put () , que el primer Get () recibirá el nuevo valor agregado por thread2 ?

¿Fue útil?

Solución

La forma de manejar este tipo de situación es no almacenar en caché las escrituras desde múltiples lugares o controlar el acceso de alguna otra manera.

Una solución simple para esto es no escribir nada en la memoria caché de sus clientes. En cambio, si desea actualizar el valor, active una solicitud para actualizar el valor. Si ese valor se recupera de otro lugar, esto puede funcionar bien. Si se calcula o si proviene del cliente, puede ser más problemático.

Un componente común para usar con memcache, al menos en el mundo PHP, es beanstalkd como un procesador de cola de trabajo distribuido. En este escenario, puede activar una " actualizar caché " solicitar como unidad de trabajo.

Si está realizando una operación en la entrada de caché que utiliza el valor existente como entrada o de alguna otra manera introduciría una condición de carrera si get-then-update no fuera una operación atómica, una alternativa es crear un unidad de trabajo que incluye el valor antiguo y el nuevo valor. De esa manera, cualquier proceso que maneje las actualizaciones puede invalidar o manejar aquellas situaciones en las que el valor actual no es el esperado.

La interfaz memcached maneja el aumento y la disminución, por lo que si sus accesos son de ese tipo (o pueden reducirse a ese tipo de operación), eso también resuelve el problema.

Otros consejos

Para memcached, puede utilizar la operación cas () para verificar antes de hacer put () que otra operación no ha actualizado los datos.

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