Solução consistente de gravação dupla para banco de dados e cache

Para melhorar a eficiência do banco de dados, o banco de dados + cache é frequentemente usado;
para aquisição de dados, o cache é verificado primeiro. Se não houver banco de dados no cache, os resultados da consulta ao banco de dados são retornados e armazenados em cache;
mas para a escrita parte, a ordem de execução confundirá muitos amigos. Ordem inadequada levará a inconsistências entre os dados no cache e no banco de dados. Você deve escrever no cache ou na tabela do banco de dados primeiro? Você olha para baixo:
Insira a descrição da imagem aqui


Ignorar estratégia de cache


Método de leitura básico

Vejamos o método de leitura primeiro: leia o cache primeiro, vá para o banco de dados para ler se não há dados no cache, armazene-os no cache e retorne a resposta ao mesmo tempo. Não há nada a dizer, basta olhar para a foto:


Insira a descrição da imagem aqui

Atualize o banco de dados primeiro e, em seguida, exclua o cache

Olhando para a parte de gravação novamente, por instinto, você pode perguntar por que não atualizar o cache depois de atualizar o banco de dados, mas excluí-lo. Na verdade, isso também é possível em muitos cenários de negócios. Mas você deve ter cuidado ao encontrar os seguintes cenários.

(1) Atualizações frequentes estão desperdiçando recursos.
Pense nisso se você atualizar um campo na biblioteca com frequência durante um período de tempo. Então quantas vezes são atualizados, o cache é atualizado quantas vezes. No entanto, esses dados em cache foram ocasionalmente consultados várias vezes durante esse período. Isso levará ao desperdício de recursos?

(2) O cálculo dos dados armazenados em cache é complicado.Existe
uma situação em que o custo de cálculo dos dados armazenados em cache é relativamente alto. Por exemplo, para um dado, várias tabelas devem ser usadas para calcular o resultado. Portanto, toda vez que você o modifica, é necessário consultar várias tabelas para atualizar o cache. Não vale a pena perder?

(3) Ambas as situações estão disponíveis.Esta
situação é a mais mortal, não apenas modificação frequente, mas também cálculos complexos para dados em cache.

Já que a forma de atualizar o cache não é viável, então mude seu pensamento e apague-o?

Siga as etapas acima para atualizar o banco de dados primeiro, mas substitua a operação de atualização do cache pela exclusão do cache.
Nesse caso, quando a solicitação de leitura chegar, porque os dados no cache são excluídos durante a operação de atualização, eles serão lidos do banco de dados e gravados no cache. Este é um método de carregamento lento, que será calculado apenas quando o cache for necessário. Isso pode evitar muitos cálculos e atualizações frequentes.

Não parece que não há nada de errado? Você está pensando sobre isso, o que acontece se a atualização dos dados for bem-sucedida, mas a exclusão do cache falhar?


Insira a descrição da imagem aqui

Conforme mostrado na figura, o banco de dados de estado inicial e os dados no cache são consistentes, mas depois que a solicitação de gravação chega, a atualização do banco de dados é bem-sucedida, mas a exclusão do cache falha. Isso faz com que os dados do banco de dados sejam atualizados, mas ainda haja dados antigos no cache. Neste momento, se uma solicitação de leitura vier, ele lerá diretamente os dados antigos no cache e retornará.


Solução de consistência de gravação dupla


1. Exclua o cache primeiro e, em seguida, atualize o banco de dados

Como a causa do problema é a falha ao excluir o cache, primeiro nos certificamos de que o cache foi excluído com êxito e, em seguida, atualizamos o banco de dados. Em outras palavras, excluímos o cache primeiro e depois atualizamos o banco de dados.

Neste ponto, você deve ter uma ideia em sua mente, e se a atualização do banco de dados falhar? Vamos dar uma olhada nesta situação: o


Insira a descrição da imagem aqui


cache está vazio após uma exclusão bem-sucedida, mas o banco de dados falha e os dados antigos ainda são os originais. Se houver uma solicitação neste momento, assim que não houver dados no cache, o banco de dados lê os dados antigos e os atualiza no cache.

Você acha que "tudo está indo bem" e você terminou o trabalho para o jantar? Não se preocupe, veja se há alguma dúvida.

2. Estratégia de exclusão dupla de atraso de cache

Se a simultaneidade do projeto for muito baixa, o número de visitas diárias será tão pequeno, então não há nada de errado com o método de " excluir o cache primeiro e depois atualizar o banco de dados ", e raramente ocorrerá inconsistência de dados. Mas essa estratégia só pode ser considerada uma solução rudimentar. Por que você diz isso?

No caso de alta simultaneidade, é muito provável que, se duas solicitações vierem ao mesmo tempo, uma solicitação de gravação e uma solicitação de leitura.

A solicitação de gravação primeiro exclui os dados do cache e depois vai para o banco de dados para atualização. No entanto, a solicitação de gravação não foi atualizada com sucesso neste momento, ou uma transação não foi executada com sucesso.

Nesse momento, a solicitação de leitura julga se há dados no cache e, em seguida, solicita o banco de dados e grava os dados no cache após obter os dados.

Nesse caso, a solicitação de leitura obtém os dados antigos não modificados e os grava no cache. Depois de um tempo, a solicitação de gravação atualizou com sucesso o banco de dados, então os dados no cache e no banco de dados estão inconsistentes neste momento.

Talvez você esteja um pouco confuso, deixe-me explicar com uma imagem:

Insira a descrição da imagem aqui


Solução
Insira a descrição da imagem aqui
Primeiro exclua o cache do Redis ao escrever uma solicitação e aguarde um pouco de forma assíncrona para excluir o cache novamente depois que o banco de dados for atualizado com sucesso.
Esta solução é de leitura rápida, mas dados sujos aparecerão por um curto período.

Resumindo

Ignorar estratégia de cache

Ao ler, primeiro leia o cache, se não houver cache, depois leia o banco de dados e, em seguida, retire-o e coloque-o no cache e retorne a resposta ao mesmo tempo.

Ao atualizar, atualize primeiro o banco de dados e, em seguida, exclua o cache.

Esquema consistente de escrita dupla

Exclua o cache primeiro e, em seguida, atualize o banco de dados: O
problema de inconsistência entre a biblioteca e o cache causado pela falha de exclusão do cache foi resolvido e é adequado para cenários de negócios com baixa simultaneidade.

Estratégia de exclusão dupla de atraso de cache:
Esta solução resolve o problema de inconsistência causado por solicitações de leitura e gravação simultâneas sob alta simultaneidade. A velocidade de leitura é rápida, mas dados sujos podem aparecer por um curto período.


Nota

Cada solução tem suas próprias vantagens e desvantagens e não existe uma solução técnica geral para diferentes negócios. Na hora de escolher uma solução técnica, ela precisa ser determinada de acordo com o próprio negócio. Não existe o melhor, apenas o mais adequado.

Acho que você gosta

Origin blog.csdn.net/QiuHaoqian/article/details/109089867
Recomendado
Clasificación