Question

D'après ce que j'ai compris, chacune de ces méthodes: get () et put () sont atomiques.

Mais, lors de l'accès à des caches comme ehcache & amp; memcached, de manière CheckThenAct , des conditions de concurrence se présenteront.

Sur quoi faut-il se synchroniser pour s'assurer que si thread1 effectue un Get () et que thread2 effectue un Get () suivi d'un Put () , que le premier Get () recevra la nouvelle valeur ajoutée par thread2 ?

Était-ce utile?

La solution

Pour faire face à ce genre de situation, il est préférable de ne pas mettre en cache les écritures provenant de plusieurs endroits ou de contrôler l'accès de manière différente.

Une solution simple à ce problème consiste à ne faire aucune écriture dans le cache de vos clients. Si vous souhaitez mettre à jour la valeur, vous déclenchez une demande de mise à jour de la valeur. Si cette valeur est extraite ailleurs, cela peut fonctionner correctement. Si elle est calculée ou provient du client, cela peut être plus problématique.

Un composant commun à utiliser avec memcache & # 8212; au moins dans le monde PHP & # 8212; est beanstalkd en tant que processeur de files d’attente réparti. Dans ce scénario, vous pouvez activer un " update cache " demande en tant qu'unité de travail.

Si vous effectuez une opération sur l'entrée de cache qui utilise la valeur existante en tant qu'entrée ou introduit d'une autre manière une condition de concurrence critique si get-then-update n'était pas une opération atomique, une alternative consiste à créer une unité de travail qui inclut l'ancienne valeur et la nouvelle valeur. Ainsi, quel que soit le processus gérant les mises à jour, il peut invalider ou autrement gérer les situations dans lesquelles la valeur actuelle n'est pas la valeur attendue.

L’incrémentation et la décrémentation sont gérées par l’interface memcached, donc si vos accès sont de ce type (ou peuvent être réduits à ce type d’opération), cela résout également le problème.

Autres conseils

Pour memcached, vous pouvez utiliser l'opération cas () pour vérifier avant de faire le put () qu'une autre opération n'a pas mis à jour les données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top