Cómo escribir código de almacenamiento en caché con elegancia





En la práctica diaria de codificación, el almacenamiento en caché se utiliza a menudo para resolver problemas de alta concurrencia. Se puede decir que el almacenamiento en caché es la mejor herramienta para resolver picos de tráfico. Aunque el equipo de middleware del grupo ha creado una infraestructura de almacenamiento en caché y nos ha ayudado a resolver la mayoría de los problemas, en el proceso de codificación real, cuando la aplicación llama a la API de caché, todavía existen los siguientes problemas:
  1. La lógica de usar el caché es muy general. Básicamente, primero se verifica el caché y, si hay alguno, se devuelve directamente sin verificar la base de datos y luego se coloca en el caché. Esta lógica general está dispersa por todo el sistema, violando el principio de alta cohesión y bajo acoplamiento.
  2. El código de almacenamiento en caché y el código de lógica empresarial están profundamente acoplados, lo que no solo reduce la legibilidad del código, sino que también aumenta la complejidad del sistema.
  3. Si desea cambiar el caché (MDB->LDB) o actualizar la API, es necesario cambiar todos los códigos involucrados.
  4. Si desea resolver problemas comunes como la penetración de caché, la penetración de caché, la caché en cascada, etc., debe resolverlos a través del marco.
Por lo tanto, qué es el caché y cómo elegir un determinado tipo de caché no son el tema central de este artículo. Hoy escribiré sobre cómo separar el código de caché del código comercial durante el proceso de codificación real para que el código sea más conciso y sencillo. leer.

Análisis práctico


Lea los datos del caché primero y regrese directamente si hay datos. Si no se leen datos, lea los datos de la base de datos y luego actualice el caché después de que se devuelvan los datos.

Este escenario es muy común en la codificación diaria y es demasiado simple, pero el código real es muy diferente. Aquí hay algunos ejemplos:


▐Escritura tradicional  


Cualquiera que sea el caché que se utilice, úselo directamente e incorpórelo en el código comercial. Este tipo de código es algo que no quiero ver, ya sea para revisar el código o cuando las generaciones futuras aprendan el código comercial. La razón es muy simple y no tiene nada que ver con las funciones comerciales reales. No quiero saber qué caché. usas o cómo codificas el código de caché.



▐Una forma más avanzada de escribir  


En comparación con el método de escritura tradicional, para resolver el problema del almacenamiento en caché de varios formatos de datos (lista, mapa, etc.) y la serialización de varios objetos (java, json), el equipo puede encapsular el almacenamiento en caché en una API simple para que todos la usen. . Es más fácil de usar, pero el código todavía está incrustado en el código comercial y no se ha eliminado.



▐Cómo escribir anotaciones  


El último es el método de escritura de anotaciones. En comparación con los dos primeros métodos de escritura, el código se ha separado del código comercial. Las personas que leen el código solo se preocupan por cómo se implementa la función comercial, qué caché se utiliza y cómo. se implementa, que puede ignorarse por completo.


análisis de la solución de caché de primavera


Spring cache utiliza un proxy dinámico para procesar operaciones relacionadas con el caché en la clase de proxy y, al mismo tiempo, llama a métodos en la clase de proxy, de modo que el código que opera el caché y el código comercial se pueden separar, y cuando se necesita la capacidad del caché Para fortalecerlo más adelante, solo modifique el método en la clase proxy.

Lo anterior es el principio de Spring Cache. Spring Cache es un marco de almacenamiento en caché general proporcionado por Spring. Utiliza AOP para implementar funciones de almacenamiento en caché basadas en anotaciones, de modo que los desarrolladores no necesitan preocuparse por el marco de almacenamiento en caché que se utiliza en la parte inferior. Solo necesitan agregar una anotación al método para implementar la función de almacenamiento en caché. Con Spring Cache, los usuarios pueden desarrollar rápidamente una muy buena función de almacenamiento en caché.

▐Directorio de códigos  



▐Mapa de anotaciones  



▐Ejemplo de uso de anotaciones  


@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álisis del programa  


Spring Cache es muy potente y su diseño es muy elegante. Es especialmente adecuado para escenarios donde el control de caché no es tan detallado, como páginas de visualización estáticas, número de me gusta, clasificaciones, etc. La característica de estos escenarios es que no tienen requisitos tan estrictos sobre datos en tiempo real. necesita almacenar en caché la fuente de datos y almacenarla automáticamente después de que caduque. Simplemente actualice. En estos escenarios, Spring Cache es un artefacto que puede mejorar en gran medida la eficiencia de la investigación y el desarrollo.

Sin embargo, en escenarios con alta concurrencia y gran volumen de datos, aún se requiere expansión funcional para un control preciso de la granularidad de la caché.
  1. Caché multinivel;
  2. La caché se actualiza periódicamente;
  3. lista de caché;
  4. Mecanismo de protección de caché cpp;
  5. Recuento de caché.

Por ejemplo: Spring Cache no tiene una implementación de caché de segundo nivel


Esquema de caché personalizado


Conozca la solución del marco de caché de Spring e implemente un marco de caché personalizado, que no solo conserva las ventajas del marco de caché de Spring, sino que también implementa muchas capacidades faltantes de Spring Cache, como desglose de caché, protección contra penetración de caché, caché multinivel, etc. .


▐Ejemplo   de código de anotación



  ▐Estructura del proyecto



escribe al final

Con la ayuda de la implementación de Spring Cache, construimos un marco de caché personalizado y ampliamos muchas anotaciones, como recuento, actualización de caché, caché de lista, bloqueo distribuido, caché multinivel, etc., que no solo realiza la separación del código de caché y código comercial, pero también expande la capacidad de almacenamiento en caché de Spring, lo que mejora en gran medida la legibilidad del código y reduce la eficiencia del mantenimiento del código en caché.


introducción del equipo


La misión del equipo de tecnología automotriz de Tmall es experimentar la mejor vida de las personas y los automóviles, remodelar la industria automotriz y ser un administrador de automóviles atento a su alrededor. Todos ellos están formando la mente de los consumidores para ver, comprar y mantener automóviles en línea y digitalizarlos. e integrar verticalmente la industria automotriz y, a través de los avances del modelo, aprovechar la integración de productos y efectos, mejorar la eficiencia de la industria y crear dividendos en la industria.


¤Ampliar lectura¤  

Tecnología 3DXR  |  tecnología de terminales  |  tecnología de audio y vídeo

Tecnología del lado del servidor  |  Calidad técnica  |  Algoritmo de datos


Este artículo se comparte desde la cuenta pública de WeChat: Big Taobao Technology (AlibabaMTT).
Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Este artículo participa en el " Plan de creación de fuentes OSC ". Los que están leyendo pueden unirse y compartir juntos.

Un programador nacido en los años 90 desarrolló un software de portabilidad de vídeo y ganó más de 7 millones en menos de un año. ¡El final fue muy duro! Los estudiantes de secundaria crean su propio lenguaje de programación de código abierto como una ceremonia de mayoría de edad: comentarios agudos de los internautas: debido al fraude desenfrenado, confiando en RustDesk, el servicio doméstico Taobao (taobao.com) suspendió los servicios domésticos y reinició el trabajo de optimización de la versión web Java 17 es la versión Java LTS más utilizada. Cuota de mercado de Windows 10. Alcanzando el 70%, Windows 11 continúa disminuyendo. Open Source Daily | Google apoya a Hongmeng para hacerse cargo de los teléfonos Android de código abierto respaldados por Docker; Electric cierra la plataforma abierta Apple lanza el chip M4 Google elimina el kernel universal de Android (ACK) Soporte para la arquitectura RISC-V Yunfeng renunció a Alibaba y planea producir juegos independientes en la plataforma Windows en el futuro
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

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