Pergunta

No meu entendimento, cada um desses métodos: get() e put() são atômicas

.

Mas, ao acessar caches como ehcache & memcached, de uma forma CheckThenAct, surgirão condições de corrida.

O que devemos sincronizar para garantir que, se thread1 faz um Get() e thread2 faz um Get() seguido por um Put(), que o primeiro Get() receberá o novo valor adicionado por thread2?

Foi útil?

Solução

A maneira de lidar com este tipo de situação é não a gravações de cache de vários lugares ou para controlar o acesso de alguma outra forma.

Uma solução simples para isso é não fazer quaisquer gravações para o cache de seus clientes. Em vez disso, se você quiser atualizar o valor que você disparar uma solicitação para que o valor atualizado. Se esse valor é recuperado de algum outro lugar, então isso pode funcionar bem. Se ele é calculado ou não vem do cliente, então ele pode ser mais problemática.

Um componente comum para usar com cache de memória, pelo menos no mundo PHP-se Beanstalkd como um processador de fila de trabalho distribuído. Neste cenário você pode disparar uma "cache update" pedido como uma unidade de trabalho.

Se você está fazendo uma operação na entrada de cache que usa o valor existente como uma entrada ou de alguma outra forma iria introduzir uma condição de corrida se get-então-update não fosse uma operação atômica, uma alternativa é criar um unidade de trabalho que inclui o valor antigo eo novo valor. Dessa forma, qualquer que seja alças processo as atualizações podem invalidar ou de outra forma lidar com as situações em que o valor atual não é o valor esperado.

Aumentando e Diminuindo são tratadas pela interface memcached isso, se seus acessos são desse tipo (ou pode ser reduzido a esse tipo de operação), que resolve o problema bem.

Outras dicas

Para memcached você pode utilizar a operação cas () para verificar antes de fazer a put (), que outra operação não actualiza os dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top