Como garantir a consistência entre o cache e o banco de dados Redis? Exclusão síncrona + exclusão dupla atrasada + monitoramento assíncrono + esquemas de garantia múltipla

navegação:

[Notas de Java + Resumo de pisar no poço] Java Basics + Advanced + JavaWeb + SSM + SpringBoot + St. Regis Takeaway + SpringCloud + Dark Horse Tourism + Guli Mall + Xuecheng Online + MySQL Advanced Chapter + Design Mode + Perguntas comuns da entrevista + Fonte Código

Índice

1. Quatro estratégias básicas de sincronização

1.1 Estratégia de sincronização

1.2 Atualizar cache ou excluir cache?

1.2.1 Vantagens e desvantagens de atualizar o cache

1.2.2 Vantagens e desvantagens de excluir o cache (recomendado)

1.3 Operar o banco de dados primeiro ou excluir o cache primeiro?

1.3.1 Vantagens e desvantagens de primeiro excluir o cache e depois operar o banco de dados

1.3.2 Vantagens e desvantagens de operar primeiro o banco de dados e depois excluir o cache (recomendado)

1.4 Estratégia de sincronização ideal: primeiro atualize o banco de dados e depois exclua o cache

2. Exclusão síncrona + esquema de mensagem confiável

3. Dupla exclusão atrasada: uma solução de maior consistência

4. Monitoramento assíncrono + esquema confiável de exclusão de mensagens

5. Múltiplas Garantias: Solução Final Forte Consenso


1. Quatro estratégias básicas de sincronização

1.1  Estratégia de sincronização

Para garantir a consistência de gravação dupla entre o cache e o banco de dados, existem quatro estratégias de sincronização , ou seja, atualizar o cache primeiro e depois atualizar o banco de dados, atualizar o banco de dados primeiro e depois atualizar o cache, excluir o cache primeiro e depois atualizar o banco de dados e atualize o banco de dados primeiro e depois exclua o cache. 

  • Atualize o cache primeiro e depois atualize o banco de dados: a segunda etapa falha e a biblioteca de cache contém dados sujos
  • Atualize o banco de dados primeiro e depois atualize o cache: a segunda etapa falha e a biblioteca de cache contém dados antigos
  • Exclua o cache primeiro e depois atualize o banco de dados: a segunda etapa falha e a biblioteca de cache contém dados vazios
  • Atualize o banco de dados primeiro e depois exclua o cache (recomendado): a segunda etapa falha e a biblioteca de cache contém dados antigos 

1.2 Atualizar cache ou excluir cache?

1.2.1 Vantagens e desvantagens de atualizar o cache

A vantagem de atualizar o cache é que ele pode ser atualizado em tempo hábil sempre que os dados mudam , de modo que a falta de consulta não é fácil de ocorrer, mas esta operação consome muito . Se os dados precisarem ser gravados no cache após cálculos complexos, freqüentes O cache atualizado afetará o desempenho do servidor. Se for um cenário em que os dados são gravados com frequência, o cache pode ser atualizado com frequência, mas não há empresa para ler os dados.

1.2.2  Vantagens e desvantagens de excluir o cache (recomendado)

A vantagem de deletar o cache é que a operação é simples , não importa se a operação de atualização é complexa ou não, os dados do cache são deletados diretamente. A desvantagem dessa abordagem é que, após a exclusão do cache, é provável que ocorra uma falha na próxima vez e, em seguida, o banco de dados precisará ser lido novamente. 

Por outro lado, excluir o cache é sem dúvida a melhor escolha

1.3 Operar o banco de dados primeiro ou excluir o cache primeiro?

1.3.1  Vantagens e desvantagens de primeiro excluir o cache e depois operar o banco de dados

Caso 1: o banco de dados e o conteúdo do cache são inconsistentes

Quando o thread 1 exclui o cache e não teve tempo de atualizar o banco de dados, o thread 2 lê o cache. Como os dados no cache foram limpos pelo thread 1, o thread 2 precisa ler os dados do banco de dados e, em seguida, salvar o leia os resultados no cache. Neste momento, o thread 1 atualiza e atualiza o banco de dados com sucesso. Haverá inconsistências entre o banco de dados e o conteúdo do cache.

Caso 2: quebra de cache, banco de dados travado

Quando o thread 1 exclui o cache e não teve tempo de atualizar o banco de dados, um grande número de solicitações de leitura chega. Como não há dados no cache, a quebra do cache acessa diretamente um grande número de solicitações ao banco de dados, fazendo com que o banco de dados travar.

1.3.2 Vantagens e desvantagens de operar primeiro o banco de dados e depois excluir o cache (recomendado)

Problema de dados sujos: Se o banco de dados for operado primeiro, mas o cache não for excluído, os dados antigos sempre permanecerão na biblioteca de cache, enquanto os novos dados serão armazenados em nosso banco de dados.

Solução: mecanismo de nova tentativa assíncrona

Quando os problemas acima ocorrem, geralmente usamos o mecanismo de nova tentativa para resolvê-los.Para evitar que o mecanismo de nova tentativa afete a execução do negócio principal, geralmente é recomendado que o mecanismo de nova tentativa seja executado de maneira assíncrona . Quando adotamos o mecanismo de nova tentativa, devido à existência de simultaneidade, excluir o cache primeiro ainda pode ter dados antigos armazenados no cache, enquanto novos dados são armazenados no banco de dados, e os dois dados são inconsistentes.

1.4 Estratégia de sincronização ideal: primeiro atualize o banco de dados e depois exclua o cache

Assim chegamos à conclusão que atualizar primeiro o banco de dados e depois deletar o cache é uma solução com menor impacto . Se a segunda etapa falhar, um mecanismo de nova tentativa poderá ser usado para resolver o problema.

Esquema de exclusão síncrona: primeiro atualize o banco de dados e depois exclua o cache. Adequado para cenários onde a consistência dos dados não é obrigatória

Processo: primeiro atualize o banco de dados e depois exclua o cache.

pergunta:

  • Dados sujos durante a simultaneidade: durante o período entre a consulta do banco de dados e a gravação do cache, outros threads realizam uma atualização e exclusão, resultando nos dados armazenados em cache como dados antigos
  • Falha na exclusão do cache: a biblioteca de cache ainda contém dados antigos devido a falha na exclusão

2. Exclusão síncrona + esquema de mensagem confiável

Exclusão síncrona + exclusão confiável de mensagens: adequado para cenários onde a consistência dos dados não é obrigatória

Processo: primeiro atualize o banco de dados e, em seguida, exclua o cache. Se a exclusão falhar, envie um MQ confiável e tente excluir o cache novamente até que a exclusão seja bem-sucedida ou tente novamente 5 vezes.

Problema: O MQ falhou em diversas tentativas, resultando em dados sujos de longo prazo.

3. Dupla exclusão atrasada: uma solução de maior consistência

Esquema de exclusão dupla atrasada: um esquema com maior consistência do que a estratégia de exclusão síncrona.

Processo: primeiro exclua o cache e depois atualize o banco de dados, aproximadamente uma vez após o banco de dados ser atualizado a partir da biblioteca.

Problema: O tempo está fora de controle e não há garantia de que o cache será excluído após a atualização do banco de dados do repositório. Se for excluído antes da atualização do banco de dados escravo, o usuário verificará o banco de dados escravo e gravará os dados sujos no cache antes de atualizar.

4. Monitoramento assíncrono + esquema confiável de exclusão de mensagens

Monitoramento assíncrono + exclusão confiável de mensagens: uma solução que muitos dos principais fabricantes estão usando.

processo:

  1. Nenhuma operação após atualização do banco de dados;
  2. Canal e outros componentes monitoram o log binário e enviam MQ confiável para excluir o cache quando encontram uma atualização;
  3. Se a exclusão do cache falhar, a mensagem será repetida dentro de um número limitado de vezes com base em mecanismos como confirmação manual e nova tentativa.

vantagem:

  • Exclusão assíncrona, maior desempenho;
  • Mecanismo confiável de nova tentativa de mensagem, múltiplas exclusões garantem uma exclusão bem-sucedida.

Problema: Os componentes de captura do binlog, como o canal, devem estar altamente disponíveis. Se o canal falhar, resultarão em dados sujos de longo prazo.

5. Múltiplas Garantias: Solução Final Forte Consenso

Vários esquemas de garantia: exclusão síncrona + monitoramento assíncrono + exclusão confiável de mensagens, definir tempo de expiração durante o armazenamento em cache e forçar a verificação da biblioteca principal durante a consulta; adequado para situações em que a consistência dos dados é obrigatória

  1. Exclusão síncrona: primeiro atualize o banco de dados e depois exclua o cache; após esse link, é proibido verificar os dados novamente, para evitar que os dados antigos do cache sejam encontrados novamente antes que o cache seja excluído.
  2. Monitoramento de canal: Canal e outros componentes monitoram o log binário e enviam MQ confiável para excluir o cache quando descobrem que há uma atualização; a segunda camada garante que o cache seja excluído com sucesso;
  3. Consistência de verificação de mensagem atrasada: Canal e outros componentes monitoram o log binário, enviam MQ atrasado e verificam a consistência do cache após N segundos;
  4. Tempo de expiração do cache: defina o tempo de expiração cada vez que o cache é armazenado em cache, a terceira camada garante o sucesso da exclusão do cache;
  5. Verificação obrigatória da biblioteca mestre Redis: Ao verificar o cache no futuro, é forçado a verificar a biblioteca principal do cache escravo; porque há um atraso na sincronização mestre-escravo e, ao mesmo tempo, não há necessidade de se preocupar com a pressão na biblioteca principal por causa do mecanismo de cluster de fragmentação.

Acho que você gosta

Origin blog.csdn.net/qq_40991313/article/details/131304564
Recomendado
Clasificación