Como você está usando um cache, você precisa tolerar o problema de inconsistência de dados , ou seja, em algum momento, os dados em cache são diferentes dos dados no banco de dados.
Você não precisa atualizar o valor no cache, sempre que o valor for alterado. Caso contrário, todo o sistema de cache será muito complicado (por exemplo, você precisa manter uma lista de chaves que foram armazenadas em cache), e também pode ser desnecessário fazer isso (por exemplo, o valor-chave pode ser usado apenas uma vez e não há para atualizá-lo mais).
Como podemos atualizar os dados em cache e manter o sistema de cache simples?
Normalmente, além de definir ou atualizar um par de valores-chave no cache, também definimos um
TIMEOUT
para cada chave . Depois disso, o cliente pode obter o par chave-valor do cache. No entanto, se uma chave atingir o tempo limite, o sistema de cache removerá o par chave-valor do cache. Isso se chama THE KEY HAS BEEN EXPIRED
. Na próxima vez, o cliente que tentar obter essa chave do cache não obterá nada. Isso é chamado de CACHE MISS
. Nesse caso, o cliente precisa obter o par chave-valor do banco de dados e atualizá-lo para o cache com um novo tempo limite. Se os dados foram atualizados no banco de dados, enquanto a chave NÃO tiver expirado no cache, o cliente obterá dados inconsistentes. No entanto, quando a chave expirar, seu valor será recuperado do banco de dados e inserido no cache por algum cliente. Depois disso, outros clientes receberão dados atualizados até que os dados sejam alterados novamente.
Como definir o tempo limite?
Normalmente, há dois tipos de política de expiração:
- Expira em
N
segundos/minutos/horas... - Expira em algum momento futuro, por exemplo expira em 30/07/2017 00:00:00
Um tempo limite grande pode reduzir bastante a carga do banco de dados, enquanto os dados podem ficar desatualizados por um longo tempo. Um pequeno tempo limite pode manter os dados atualizados o máximo possível, enquanto o banco de dados terá uma carga pesada. Portanto, você precisa equilibrar a compensação ao projetar o tempo limite .
Como as chaves do Redis expiram?
O Redis tem duas maneiras de expirar as chaves:
- Quando o cliente tenta operar em uma chave, o Redis verifica se a chave atingiu o tempo limite. Se isso acontecer, o Redis remove a chave e age como se a chave não existisse. Dessa forma, o Redis garante que o cliente não receba dados expirados.
- O Redis também tem um thread de expiração que faz amostras de chaves em uma frequência configurada. Se as chaves atingirem o tempo limite, o Redis as removerá. Dessa forma, o Redis pode acelerar o processo de expiração da chave.