Compreensão do cache Java

bc4596186e8c402a8161f81f9050dcfb.jpg

 

 

Uso de CPU: Se você tiver determinados aplicativos que exigem muita CPU para calcular, como expressões regulares, se você usa expressões regulares com freqüência e elas ocupam muita CPU, então você deve usar o cache para armazenar as expressões regulares. são armazenados em cache.

Desempenho de IO do banco de dados: se você descobrir que há uma grande quantidade de dados que precisam ser consultados com frequência ou que alguns dados não mudam com frequência, para melhorar o desempenho de IO do banco de dados, você pode usar o cache

Definição de cache

 

O chamado cache serve para armazenar na memória objetos que são frequentemente chamados por um programa ou sistema, para que possam ser chamados rapidamente quando usados ​​​​novamente, sem a necessidade de criar novas instâncias duplicadas. Isso pode reduzir a sobrecarga do sistema e melhorar a eficiência do sistema.

O cache pode ser dividido em duas categorias principais:

Por meio do cache de arquivos, como o nome sugere, o cache de arquivos refere-se ao armazenamento de dados em disco, seja no formato XML, no formato DAT de arquivo serializado ou em outros formatos de arquivo;

O cache de memória serve para criar uma área de memória estática e armazenar dados nela. Por exemplo, em nossa arquitetura B/S, os dados são armazenados em um Aplicativo ou em um Mapa estático.

cache local

 

O chamado cache local é relativo à rede (incluindo clusters, acesso ao banco de dados, etc.)

No sistema, alguns dados são pequenos em tamanho, mas acessados ​​com muita frequência (como dados de área administrativa padrão nacional ou alguns dicionários de dados, etc.).Para este cenário, os dados precisam ser armazenados em cache no cache local do aplicativo para melhorar acesso ao sistema. Eficiência, reduzindo o acesso desnecessário ao banco de dados (o acesso ao banco de dados ocupa conexões de banco de dados e o consumo de rede é relativamente grande)

Mas uma coisa que você precisa prestar atenção é o espaço ocupado pelo cache e a política de invalidação de cache.

Definição de cache distribuído/cluster

 

Uma extensão do conceito tradicional de cache independente, usado para representar um cache que pode abranger vários servidores e ser escalonável ao mesmo tempo. Para ser franco, é um método de cache que armazena dados locais em cache em um portador de cache clusterizável remoto e usa a rede para trocar dados.

Portadores de cluster comumente usados: Redis; Memcached

Cache multinível

 

Definição: O sistema usa uma variedade de tecnologias de cache (cache local e cache distribuído) para armazenar dados. Ao aplicar dados, os dados são lidos sequencialmente de acordo com a prioridade (primeiro local, depois distribuído). Se não houver cache em todos os caches, dados, ler e gravar dados no banco de dados e armazenar em cache e atualizar os dados obtidos em sequência (primeiro distribuído, depois local)

Por que usar a tecnologia de cache multinível (tome o cache de primeiro nível L1 (Cafeína) e o cache de segundo nível L2 (Redis) como exemplo)

Se houver apenas L1, depois que o sistema for reimplantado, todos os dados armazenados em cache desaparecerão;

Se você precisar apenas de L2 e usar Redis, muitos sistemas usarão serviços em nuvem. Neste momento, o acesso ao Redis exigirá uma certa quantidade de E/S de rede e serialização e desserialização. Embora o desempenho seja muito alto, não é tão rápido quanto memória local L1.

Técnicas comumente usadas para cache multinível

 

Use Cafeína como cache de primeiro nível e Redis como cache de segundo nível.

Primeiro, consulte os dados no Caffeine e retorne-os diretamente, se houver. Caso contrário, prossiga para a etapa 2.

Em seguida, consulte no Redis. Se os dados retornados forem encontrados, preencha esses dados no Caffeine. Se não for encontrado, prossiga para a etapa 3.

Por fim, consulte no Mysql. Se os dados retornados forem encontrados, preencha os dados no Redis e no Caffeine sucessivamente.

Para o cache do Cafeína, se houver atualização de dados, o cache da máquina que atualizou os dados só poderá ser excluído. Outras máquinas só podem expirar o cache através do timeout. Existem duas estratégias para configuração de timeout.

Defina o tempo após a gravação expirar.

Defina quanto tempo leva para atualizar depois de escrever

atualizações de cache

 

Exclua o cache primeiro e depois atualize o banco de dados.

Há um grande problema com esta operação. Após a exclusão do cache, há uma solicitação de leitura. Neste momento, como o cache foi excluído, a biblioteca será lida diretamente. Os dados na operação de leitura são antigos e serão carregados no cache.Leituras subsequentes Solicitam todos os dados antigos acessados.

Atualize o banco de dados primeiro e depois exclua o cache (recomendado)

Há dados que não estão armazenados em cache no momento, portanto, a solicitação de consulta será descartada diretamente no banco de dados. A operação de atualização ocorre após a solicitação de consulta, mas a operação de atualização exclui a operação do banco de dados após a conclusão da consulta e antes do cache é preenchido, o que causará inconsistências de cache entre nosso cache e o banco de dados., mas a probabilidade desse problema é muito pequena.

Por que excluir o cache em vez de atualizá-lo

Você pode pensar sobre isso. Quando há várias solicitações simultâneas para atualizar dados, você não pode garantir que a ordem de atualização do banco de dados seja consistente com a ordem de atualização do cache. Então, haverá inconsistências entre os dados no banco de dados e no cache. . Portanto, considere geralmente excluir o cache.

Esconda os Três Mosqueteiros

 

penetração de cache

Explicação: Penetração de cache significa que os dados consultados não existem no banco de dados, então naturalmente não existem no cache. Portanto, se não puderem ser encontrados no cache, eles irão para o banco de dados para obter a consulta. Se houver houver muitas solicitações desse tipo, então nosso banco de dados irá O estresse aumentará naturalmente

solução:

Acordo: os retornos NULL ainda são armazenados em cache, os retornos que lançam exceções não são armazenados em cache e tome cuidado para não armazenar em cache as exceções que também são lançadas. Usar este método aumentará o custo de manutenção do nosso cache. Precisamos excluir esse cache vazio ao inserir o cache. Claro, podemos resolver esse problema definindo um tempo limite mais curto.

Desenvolva algumas regras para filtrar alguns dados que não podem existir. Use BitMap para dados pequenos e filtro Bloom para grandes dados. Por exemplo, o ID do seu pedido está obviamente no intervalo de 1 a 1.000. Se não forem dados entre 1 e 1.000, então, na verdade, pode ser filtrado diretamente.

Divisão de cache

Explicação: O tempo de expiração está definido para algumas chaves, mas são dados quentes. Se uma chave falhar, um grande número de solicitações poderá chegar, o cache falhará e o banco de dados será acessado. Neste momento, o número de bancos de dados as visitas aumentarão acentuadamente.

solução:

Adicione um bloqueio distribuído: ao carregar dados, você pode usar um bloqueio distribuído para bloquear a chave dos dados. Você pode usar diretamente a operação setNX no Redis. Para o thread que obtém o bloqueio, consulte o banco de dados e atualize o cache, e outros threads adotam uma estratégia de repetição, para que o banco de dados não seja acessado por muitos threads ao mesmo tempo.

Carregamento assíncrono: como a quebra de cache é um problema que ocorre apenas com dados quentes, você pode adotar uma estratégia de atualizar automaticamente essa parte dos dados quentes quando eles expirarem, em vez de eliminá-los automaticamente quando expirarem. A eliminação é, na verdade, para a atualidade dos dados, portanto, a atualização automática também pode ser usada.

avalanche de cache

Explicação: Avalanche de cache significa que o cache está indisponível ou um grande número de caches expira no mesmo período devido ao mesmo tempo limite.Um grande número de solicitações acessam diretamente o banco de dados e a pressão excessiva no banco de dados causa uma avalanche do sistema.

solução:

Aumente a disponibilidade do sistema de cache, preste atenção à integridade do cache monitorando-o e expanda o cache adequadamente de acordo com o volume de negócios.

O cache multinível é usado, e diferentes níveis de cache têm configurações de tempo limite diferentes. Mesmo que um determinado nível de cache expire, outros níveis de cache serão cobertos.

O tempo de expiração do cache pode ser um valor aleatório. Por exemplo, se um tempo limite de 10 minutos foi definido no passado, cada chave pode expirar aleatoriamente em 8 a 13 minutos. Tente fazer com que o tempo de expiração de chaves diferentes seja diferente.

Monitoramento de cache

 

Muitas pessoas também ignoram o monitoramento de cache. Basicamente, se nenhum erro for relatado após ficar online, ele entrará em vigor por padrão. Porém, existe esse problema: devido à falta de experiência, muitas pessoas podem definir tempo de expiração inadequado ou tamanho de cache inadequado, resultando em baixa taxa de acertos do cache, fazendo com que o cache se torne um ornamento no código. Portanto, também é importante monitorar vários indicadores de cache. Através de seus diferentes dados de indicadores, podemos otimizar os parâmetros de cache para otimizar o cache.

Acho que você gosta

Origin blog.csdn.net/weixin_57763462/article/details/132768595
Recomendado
Clasificación