Como escrever código de cache com elegância





Na prática diária de codificação, o cache é frequentemente usado para resolver problemas de alta simultaneidade. O cache pode ser considerado a melhor ferramenta para resolver picos de tráfego. Embora a equipe de middleware do grupo tenha construído uma infraestrutura de cache e nos ajudado a resolver a maioria dos problemas, no processo de codificação real, os seguintes problemas ainda existem quando o aplicativo chama a API de cache:
  1. A lógica de utilização do cache é muito geral. Basicamente, o cache é verificado primeiro e, se houver, é retornado diretamente sem verificar o banco de dados e depois colocado no cache. Esta lógica geral está espalhada por todo o sistema, violando o princípio de alta coesão e baixo acoplamento.
  2. O código de cache e o código de lógica de negócios estão profundamente acoplados, o que não apenas reduz a legibilidade do código, mas também aumenta a complexidade do sistema.
  3. Caso queira trocar o cache (MDB->LDB) ou atualizar a API, todos os códigos envolvidos precisam ser alterados.
  4. Se você deseja resolver problemas comuns, como penetração de cache, penetração de cache, cache em cascata, etc., você precisa resolvê-los por meio do framework.
Portanto, o que é cache e como escolher um determinado tipo de cache não são o foco deste artigo. Hoje escreverei sobre como separar o código do cache do código comercial durante o processo de codificação real para tornar o código mais conciso e fácil. ler.

Análise prática


Leia os dados do cache primeiro e retorne diretamente se houver dados. Se nenhum dado for lido, leia os dados do banco de dados e atualize o cache após os dados serem retornados.

Este cenário é muito comum na codificação diária e é muito simples, mas o código real é realmente muito diferente.


▐Escrita tradicional  


Qualquer que seja o cache usado, use-o diretamente e incorpore-o ao código comercial. Esse tipo de código é algo que não quero ver, seja para revisão de código ou quando as gerações futuras aprenderem código de negócios. O motivo é muito simples e não tem nada a ver com funções de negócios reais. você usa ou como você codifica o código de cache.



▐Uma forma mais avançada de escrever  


Comparado com o método de escrita tradicional, a fim de resolver o problema de armazenamento em cache de vários formatos de dados (lista, mapa, etc.) e serialização de vários objetos (java, json), a equipe pode encapsular o armazenamento em cache em uma API simples para todos usarem . É mais fácil de usar, mas o código ainda está incorporado no código comercial e não foi eliminado.



▐Como escrever anotações  


O último é o método de escrita de anotações. Em comparação com os dois primeiros métodos de escrita, o código foi separado do código de negócios. As pessoas que lêem o código só se importarão com como a função de negócios é implementada, qual cache é usado e como ele é usado. é implementado, o que pode ser completamente ignorado.


análise de solução de cache de primavera


Spring cache usa proxy dinâmico para processar operações relacionadas ao cache na classe proxy e, ao mesmo tempo, chama métodos na classe proxy, para que o código que opera o cache e o código de negócios possam ser separados e quando a capacidade do cache precisar para ser fortalecido posteriormente, basta modificar o método na classe proxy.

O acima é o princípio do Spring Cache. Spring Cache é uma estrutura geral de cache fornecida pelo Spring. Ele usa AOP para implementar funções de cache baseadas em anotações, para que os desenvolvedores não precisem se preocupar com qual estrutura de cache é usada na parte inferior. Eles só precisam simplesmente adicionar uma anotação ao método para implementar a função de cache. Usando Spring Cache, os usuários podem desenvolver rapidamente uma função de cache muito boa.

▐Diretório de códigos  



▐Mapa de anotação  



▐Exemplo de uso de anotação  


@Cacheable(value = "user_cache", unless = "#result == null")public User getUserById(Long id) { return userMapper.getUserById(id);}@CachePut(value = "user_cache", key = "#user.id", unless = "#result == null")public User updateUser(User user) { userMapper.updateUser(user); return user;}@CacheEvict(value = "user_cache", key = "#id")public void deleteUserById(Long id) { userMapper.deleteUserById(id);}


▐Análise do programa  


Spring Cache é muito poderoso e seu design é muito elegante. É especialmente adequado para cenários onde o controle de cache não é tão detalhado, como páginas de exibição estática, número de curtidas, classificações, etc. A característica desses cenários é que eles não possuem requisitos tão rígidos em dados em tempo real. precisa armazenar em cache a fonte de dados e armazená-la automaticamente após a expiração. Nesses cenários, o Spring Cache é um artefato que pode melhorar muito a eficiência da pesquisa e do desenvolvimento.

Entretanto, em cenários com alta simultaneidade e grande volume de dados, a expansão funcional ainda é necessária para o controle fino da granularidade do cache.
  1. Cache multinível;
  2. O cache é atualizado regularmente;
  3. cache de lista;
  4. Mecanismo de proteção de cache cpp;
  5. Contagem de cache.

Por exemplo: Spring Cache não possui uma implementação de cache de segundo nível


Esquema de cache personalizado


Aprenda a solução da estrutura Spring Cache e implemente uma estrutura de cache personalizada, que não apenas retém as vantagens da estrutura Spring Cache, mas também realiza muitos recursos ausentes do Spring Cache, como quebra de cache, proteção contra penetração de cache, cache multinível, etc. .


▐Exemplo   de código de anotação



  ▐Estrutura do projeto



escreva no final

Com a ajuda da implementação do Spring Cache, construímos uma estrutura de cache personalizada e estendemos muitas anotações, como contagem, atualização de cache, cache de lista, bloqueio distribuído, cache multinível, etc., que não apenas realiza a separação do código do cache e código de negócios, mas também expande a primavera. A capacidade de cache melhora muito a legibilidade do código e reduz a eficiência da manutenção do código em cache.


introdução da equipe


A missão da Tmall Automotive Technology Team é experimentar a vida definitiva das pessoas e dos carros, remodelar a indústria automotiva e ser um administrador de automóveis atencioso ao seu redor. Todos eles estão construindo as mentes dos consumidores para visualização, compra e manutenção de carros online, digitalização. e integrar verticalmente a indústria automotiva e, por meio de inovações do Modelo, alavancar a integração de produto e efeito, melhorar a eficiência da indústria e criar dividendos para a indústria.


¤Expandir leitura¤  

Tecnologia 3DXR  |  tecnologia de terminal  | 

Tecnologia do lado do servidor  |  Qualidade técnica Algoritmo de dados  | 


Este artigo foi compartilhado na conta pública do WeChat - Big Taobao Technology (AlibabaMTT).
Se houver alguma violação, entre em contato com [email protected] para exclusão.
Este artigo participa do “ Plano de Criação da Fonte OSC ”. Você que está lendo é bem-vindo para participar e compartilhar juntos.

Um programador nascido na década de 1990 desenvolveu um software de portabilidade de vídeo e faturou mais de 7 milhões em menos de um ano. O final foi muito punitivo! Alunos do ensino médio criam sua própria linguagem de programação de código aberto como uma cerimônia de maioridade - comentários contundentes de internautas: Contando com RustDesk devido a fraude desenfreada, serviço doméstico Taobao (taobao.com) suspendeu serviços domésticos e reiniciou o trabalho de otimização de versão web Java 17 é a versão Java LTS mais comumente usada no mercado do Windows 10 Atingindo 70%, o Windows 11 continua a diminuir Open Source Daily | Google apoia Hongmeng para assumir o controle de telefones Android de código aberto apoiados pela ansiedade e ambição da Microsoft; Electric desliga a plataforma aberta Apple lança chip M4 Google exclui kernel universal do Android (ACK) Suporte para arquitetura RISC-V Yunfeng renunciou ao Alibaba e planeja produzir jogos independentes na plataforma Windows no futuro
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/u/4662964/blog/11104135
Recomendado
Clasificación