[Serie] el grado de apertura proyecto de código basado en la primavera de caché caché multinivel (caché Ehcache mientras que la integración caché local y distribuido Redis)

Una memoria caché

Cuando la cantidad de sistema concurrente, y si vamos con frecuencia acceder a la base de datos, entonces la presión seguirá aumentando la base de datos, se bloquea la base de datos pueden ocurrir incluso en el pico fenómeno. Así que, en general, vamos a utilizar la memoria caché para resolver este problema de acceso concurrente con el acceso de base de datos, usuario a entrar, para que se iniciará con la caché de consultas, si no se devuelve si ya no es una consulta de la base de datos, y finalmente agrega a la caché, y luego se devuelve al usuario, por supuesto, a continuación, puede utilizar la caché para proporcionar una función de búsqueda.

La memoria caché, por lo general se puede dividir en la memoria caché local y caché distribuida.

comúnmente utilizado caché local tiene ehcache, guayaba caché, mientras que generalmente utilizamos ehcache, después de todo, él es puro Java, no es un problema que podemos resolver el código fuente, y también propio desarrollo secundario para ampliar la funcionalidad.

el almacenamiento en caché comúnmente distribuido por supuesto, es los Redis, Redis es una basada en la memoria y de un solo subproceso, la eficiencia es muy alta.

二, caché de Primavera

Creo que si se desea integrar la caché para el proyecto, vamos a utilizar la caché de primavera, no sólo integra el almacenamiento en caché marco múltiple (ehcache, JCache etc.), puede también estar basada en el uso de anotaciones, es muy conveniente.

marco de almacenamiento en caché integrada en primavera-marco-soporte en:
Aquí Insertar imagen Descripción
Caché de anotación en la primavera-contexto:
Aquí Insertar imagen Descripción
Por supuesto, hay integración Redis en el contexto de la Primavera, pero podemos encontrar la colección Primavera-data-Redis en.
Aquí Insertar imagen Descripción
Pero todos sabemos, ya sea en el proyecto del resorte o de la primavera de arranque, podemos integrar la totalidad de la memoria caché, la memoria caché no puede consolidar múltiples simultáneamente.

En la primavera de arranque, que suelen utilizar spring.cache.typepara especificar el caché de usar, y luego rellenar la información de configuración correspondiente para completar la configuración automática.
Aquí Insertar imagen Descripción
fuente CacheType: podemos ver, la primavera es compatible con una gran variedad de marco de almacenamiento en caché.

package org.springframework.boot.autoconfigure.cache;

public enum CacheType {
    GENERIC,
    JCACHE,
    EHCACHE,
    HAZELCAST,
    INFINISPAN,
    COUCHBASE,
    REDIS,
    CAFFEINE,
    SIMPLE,
    NONE;

    private CacheType() {
    }
}

Así que si sólo tenemos tanta necesidad de integrar tanto el almacenamiento en caché marco: por ejemplo, una memoria caché local de Ehcache, una memoria caché distribuida Redis,

Eso puede toda ella?

Usted podría ser capaz de hacerlo, pero no proporciona esta caché multinivel primavera, pero se requiere de ti mismo con el todo.

三, h2cache-primavera-arranque-motor de arranque

1. ¿Cuál es h2cache-primavera-arranque-motor de arranque?

En los micro-servicios, cada servicio tiene estado, necesidad de ir a través de RPC o HTTP para comunicarse entre el servicio. Y cada servicio tiene su propia base de datos correspondiente, de manera que si el servicio de la necesidad de obtener datos en un servicio de mesa B, entonces usted necesita una comunicación HTTP o RPC, y que si el pico de la necesidad de llamar a 100 veces por segundo, lo que significaría que requiere 100 de comunicación HTTP o RPC, la interfaz que es propiedades consumir bastante tiempo.

Entonces, ¿cómo se puede solucionar?

Eso no es ciertamente el caché local, ya que los diferentes servicios son generalmente desplegados en diferentes máquinas más arriba, así que esta vez necesitamos una caché distribuida, tales como Redis, sin embargo, el servicio de alto tráfico, por supuesto, todavía necesitan una caché local . Así que, finalmente, necesitamos no sólo la memoria caché local, pero también caché distribuida, pero la primavera de arranque no proporcionó una función de caché como de varios niveles, por lo que es necesario integrar a nosotros mismos.

No se preocupen, ya tengo un resorte de arranque de arranque conjunto, es decir h2cache-spring-boot-starter, sólo tenemos que configurar la información correspondiente en el archivo de configuración, puede activar la función de la memoria caché multinivel.

2, iniciado

Añadir la dependencia:

Hemos introducido debajo de lo normal puede confiar, porque he publicado este artículo con el repositorio central de Maven de ~

<denpency>
    <groupId>com.github.howinfun</groupId>
    <artifactId>h2cache-spring-boot-starter</artifactId>
    <version>0.0.1</version>
</denpency>

Activación de los servicios en las propiedades de la primavera de arranque, y añadir la configuración correspondiente:

Abrir el servicio de caché multinivel:

# Enable L2 cache or not
h2cache.enabled=true

Configuración Ehcache:

# Ehcache Config
## the path of ehcache.xml (We can put it directly under Resources) 
h2cache.ehcache.filePath=ehcache.xml
#Set whether the EhCache CacheManager should be shared (as a singleton at the ClassLoader level) or independent (typically local within the application).Default is "false", creating an independent local instance.
h2cache.ehcache.shared=true

Redis de configuración: incluyendo la configuración predeterminada de la caché y la configuración de la caché personalizada

Punto a destacar es: h2cache-primavera-arranque-motor de arranque mientras que la introducción Lettucey el Jediscliente, y el cliente Lechuga primavera de arranque usando el valor por defecto, por lo que si tenemos que utilizar el cliente Jedis, es necesario contar Lechuga eliminado.

# Redis Config
## default Config (expire)
h2cache.redis.default-config.ttl=200
### Disable caching {@literal null} values.Default is "false"
h2cache.redis.default-config.disable-null-values=true
### Disable using cache key prefixes.Default is "true"
h2cache.redis.default-config.use-prefix=true

## Custom Config list
### cacheName -> @CacheConfig#cacheNames @Cacheable#cacheNames and other comments, etc   
h2cache.redis.config-list[0].cache-name=userCache
h2cache.redis.config-list[0].ttl=60
h2cache.redis.config-list[0].use-prefix=true
h2cache.redis.config-list[0].disable-null-values=true

h2cache.redis.config-list[1].cache-name=bookCache
h2cache.redis.config-list[1].ttl=60
h2cache.redis.config-list[1].use-prefix=true

#Redis
spring.redis.host=10.111.0.111
spring.redis.password=
spring.redis.port=6379
spring.redis.database=15
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=30

Cómo utilizar las anotaciones de caché

Mientras que hacer antes de utilizar Spring Cachelas anotaciones pueden ser.

por ejemplo:

El código de la capa de persistencia, el uso que es: la mybatis-PLUS .

package com.hyf.testDemo.redis;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.stereotype.Repository;

/**
 * @author Howinfun
 * @desc
 * @date 2020/3/25
 */
@Repository
// Global cache config,We usually set the cacheName               
@CacheConfig(cacheNames = {"userCache"})
public interface UserMapper extends BaseMapper<User> {

    /**
    * put the data to cache(Ehcache & Redis)
    * @param id
    * @return 
    */
    @Cacheable(key = "#id",unless = "#result == null")
    User selectById(Long id);

    /**
    * put the data to cache After method execution
    * @param user
    * @return 
    */
    @CachePut(key = "#user.id", condition = "#user.name != null and #user.name != ''")
    default User insert0(User user) {
        
        this.insert(user);
        return user;
    }

    /**
    * evict the data from cache
    * @param id
    * @return 
    */
    @CacheEvict(key = "#id")
    int deleteById(Long id);

    /**
    * Using cache annotations in combination
    * @param user
    * @return 
    */
    @Caching(
            evict = {@CacheEvict(key = "#user.id", beforeInvocation = true)},
            put = {@CachePut(key = "#user.id")}
    )
    default User updateUser0(User user){
        
        this.updateById(user);
        return user;
    }
}

prueba:

Pregunta: Se puede ver que en los resultados de la consulta de base de datos, se añadirán a los datos Ehcachey la Redismemoria caché, todo será entonces preguntar por el inicio Ehcacheo Redisen la consulta.

2020-04-03 09:55:09.691  INFO 5920 --- [nio-8080-exec-7] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2020-04-03 09:55:10.044  INFO 5920 --- [nio-8080-exec-7] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2020-04-03 09:55:10.051 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById       : ==>  Preparing: SELECT id,create_time,update_time,read_frequency,version,book_name FROM book WHERE id=? 
2020-04-03 09:55:10.068 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById       : ==> Parameters: 51(Long)
2020-04-03 09:55:10.107 DEBUG 5920 --- [nio-8080-exec-7] c.h.t.redis.BookMapper2.selectById       : <==      Total: 1
2020-04-03 09:55:10.113  INFO 5920 --- [nio-8080-exec-7] c.hyf.cache.cachetemplate.H2CacheCache   : insert into ehcache,key:51,value:Book2(id=51, bookName=微服务架构, readFrequency=1, createTime=2020-03-20T16:10:13, updateTime=2020-03-27T09:14:44, version=1)
2020-04-03 09:55:10.118  INFO 5920 --- [nio-8080-exec-7] c.hyf.cache.cachetemplate.H2CacheCache   : insert into redis,key:51,value:Book2(id=51, bookName=微服务架构, readFrequency=1, createTime=2020-03-20T16:10:13, updateTime=2020-03-27T09:14:44, version=1)

2020-04-03 09:55:31.864  INFO 5920 --- [nio-8080-exec-2] c.hyf.cache.cachetemplate.H2CacheCache   : select from ehcache,key:51

Eliminar: Al eliminar los datos en la base de datos, se eliminará Ehcachey Redislos correspondientes datos de la caché.

2020-04-03 10:05:18.704 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById       : ==>  Preparing: DELETE FROM book WHERE id=? 
2020-04-03 10:05:18.704 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById       : ==> Parameters: 51(Long)
2020-04-03 10:05:18.731 DEBUG 5920 --- [nio-8080-exec-3] c.h.t.redis.BookMapper2.deleteById       : <==    Updates: 1
2020-04-03 10:05:18.732  INFO 5920 --- [nio-8080-exec-3] c.hyf.cache.cachetemplate.H2CacheCache   : delete from ehcache,key:51
2020-04-03 10:05:18.844  INFO 5920 --- [nio-8080-exec-3] c.hyf.cache.cachetemplate.H2CacheCache   : delete from redis,key:51

Otros no demuestran ...

En cuarto y último

Por supuesto, este arranque es bastante simple, si usted está interesado, puede ir a ver cómo el código fuente se basa en la primavera de caché caché multinivel ~

Supongo que te gusta

Origin www.cnblogs.com/Howinfun/p/12651576.html
Recomendado
Clasificación