caché SpringBoot serie de tutoriales

Uso del proyecto SpringBoot en la caché antes de introducir primero la abstracción caché primavera y JSR107, este es mi blog en Silicon Valley vídeo y notas que aún están aprendiendo efectuarse previa consulta de otro blog, sólo para enterarse de referencia

@

Un caché primavera abstracción

1.1 Caché definición abstracta

Versión 3.1 define la primavera org.springframework.cache.Cache
interfaces y org.springframework.cache.CacheManager para unificar diferentes tecnologías de almacenamiento en caché, y apoyan el uso de Java Caché (JSR-107) anotaciones para simplificar el desarrollo de nuestra memoria caché. Primavera caché sólo es responsable del mantenimiento de la capa de abstracción, la implementación específica está determinado por su selección de tecnología. Las técnicas de caché y caché acoplado.

1.2, interfaces importantes

  • Cache: caché interfaces de especificación abstracta, las implementaciones de caché tienen: RedisCache, EhCacheCache, ConcurrentMapCache etc.
  • CacheManager: Administrador de caché, la gestión del ciclo de vida de la caché

Dos, JSR107

2.1, la interfaz JSR107 núcleo

Java almacenamiento en caché (JSR-107) define una interfaz de núcleo 5, respectivamente CachingProvider, CacheManager, Cache, la entrada y de expiración.

  • CachingProvider: crear, configurar, adquirir, gestionar y controlar múltiples CacheManager
  • CacheManager: crear, configurar, adquirir, administrar y control múltiple de un nombre único de caché, caché existe en el contexto de CacheManager. A CacheManager corresponde a solamente un CachingProvider
  • Cache: CacheManager es administrado, la gestión del ciclo de vida CacheManager caché, en el marco de la presente CacheManager caché, la estructura de datos es un mapa similar a, y se almacena temporalmente como el valor de la clave de índice. Caché es una propiedad única de un CacheManager
  • Entrada: caché es una memoria en los pares de valores clave
  • Caducidad: Cada entrada se almacena en la caché tiene un período definido. Una vez pasado este tiempo, la entrada caducará automáticamente, expirado, las entradas no tienen acceso, actualizar y operaciones de borrado. duración de la caché puede ser establecido por ExpiryPolicy

2,2, JSR107 ilustra

Silicon Valley icono sigue citando cursos de vídeo:
Aquí Insertar imagen Descripción

Tres, uso de la caché de Primavera

3.1 Notas importantes Introducción

Antes de ejemplos de buenas prácticas, explique brevemente la anotación caché importante proporcionada por la primavera

  • @Cacheable: Método para la configuración, es posible de acuerdo con los resultados de su método de parámetro de petición de memoria caché
  • @CacheEvict: Vaciar caché
  • @CachePut: tanto la llamada a métodos, y actualizar los datos de la caché
  • @EnableCaching: abierta caché basado en anotación
  • @Caching: definir reglas de caché complejos

3.2 listo Ambiental

bien, este blog es todavía ejemplos de vídeo de Silicon Valley que ser reescritos, con el ejemplo más clásico de esto se describe

Preparación del entorno:

  • experta en medio ambiente
  • IntelliJ IDEA
    nueva construcción de dos tablas:
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lastName` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `gender` int(2) DEFAULT NULL,
  `d_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `departmentName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3.3, la introducción del módulo de resorte de arranque-motor de arranque-cache

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

3,4, los principales ejemplos de notas prácticas

3.4.1, @ EnableCaching

@EnableCaching abierta caché basado en anotación


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching
public class SpringbootCacheApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootCacheApplication.class, args);
    }

}

3.4.2, @ cacheable comentario

anotaciones papel @Cacheable, también en frente de la introducción, principalmente para el método de configuración, sus resultados pueden almacenar en caché en el método de solicitud de parámetros, nos dicen acerca de los principales atributos de anotación

  • cacheNames / Valor: Especifica el componente de caché de nombres, una matriz
  • clave: datos de la caché utilizando la tecla, para determinar la caché se pueden especificar con una clave única; por ejemplo: escribir SpEL; (y el mismo sentido de a0) #id, el valor de parámetro id ,, # a0 (el primer argumento), # p0 , root.args # [0]
  • keygenerator: generador de claves; puede especificar el componente clave de su generador de Identificación (Nota: Esta tecla / keygenerator: Elija uno de los usos; no se puede utilizar)
  • cacheManager: especifica el Administrador de caché; o cacheResolver designado obtener un analizador
  • condición: el caso en el que sólo los criterios de coincidencia de la caché; utilizan expresiones Spel, por ejemplo: estado = "# a0> 1": valor del primer parámetro de> 1 sólo cuando la memoria caché
  • a menos que: Negativo caché; salvo que se especifique cuando la condición es verdadera, el valor de retorno no se almacena en caché; por ejemplo: a menos = "# a0 = 2!": Si el primer valor de parámetro no es 2, el resultado no se almacena en caché;
  • sync: si se debe utilizar el modo asíncrono
    @Cacheable(value = {"emp"}, /*keyGenerator = "myKeyGenerator",*/key = "#id",condition = "#a0>=1",unless = "#a0!=2")
    public Employee getEmp(Integer id) {
        Employee employee = this.employeeMapper.getEmpById(id);
        LOG.info("查询{}号员工数据",id);
        return employee;
    }

Se utiliza en el presente documento pueden ser keygenerator personalizada, utilizando la propiedad keygenerator = "myKeyGenerator

@Bean definir una clase, para agregar primavera KeyGenerator contenedor

@Configuration
public class CacheConfig {

    @Bean(value = {"myKeyGenerator"})
    public KeyGenerator keyGenerator(){
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                return method.getName()+"["+ Arrays.asList(params).toString()+"]";
            }
        };
    }
}

3.4.3, @ comentario CachePut

@CachePut comentario es un comentario para que el caché, pero el caché y @Cacheable tienen diferencia obvia es que está llamando el método, y actualizar los datos de la caché, es decir, después de realizar el método de operación de sincronización de actualización de la memoria caché de nuevo, por lo que la clave primaria utilizada para operaciones de actualización, sino también se puede utilizar para consulta, el atributo clave primaria y @Cacheable hay muchos detalles similares, se refieren fuente @CachePut @link

 /**
     *  @CachePut:既调用方法,又更新缓存数据;同步更新缓存
     *  修改了数据,同时更新缓存
     */
    @CachePut(value = {"emp"}, key = "#result.id")
    public Employee updateEmp(Employee employee){
        employeeMapper.updateEmp(employee);
        LOG.info("更新{}号员工数据",employee.getId());
        return employee;
    }

3.4.4, comentario @CacheEvic

Los principales atributos:

  • clave: especifica los datos a ser desalojado
  • allEntries = true: borrar todos los datos especificados en la presente memoria caché
  • beforeInvocation = false: default en nombre de operación de la memoria caché de compensación se lleva a cabo después de que el método de ejecución
  • beforeInvocation = true: Borrar la caché en la operación de nombre se realiza antes de que el método run
    @CacheEvict(value = {"emp"}, beforeInvocation = true,key="#id")
    public void deleteEmp(Integer id){
        employeeMapper.deleteEmpById(id);
        //int i = 10/0;
    }

3.4.5, @ almacenamiento en caché comentario

@Caching de reglas de caché de encargo complejas, y pueden ser integrados @Cacheable @CachePut

 // @Caching 定义复杂的缓存规则
    @Caching(
            cacheable = {
                    @Cacheable(/*value={"emp"},*/key = "#lastName")
            },
            put = {
                    @CachePut(/*value={"emp"},*/key = "#result.id"),
                    @CachePut(/*value={"emp"},*/key = "#result.email")
            }
    )
    public Employee getEmpByLastName(String lastName){
        return employeeMapper.getEmpByLastName(lastName);
    }

3.4.6, comentario @CacheConfig

Las anotaciones pueden ser utilizados para extraer @CacheConfig caché de configuración común, entonces la adición de la clase puede, por ejemplo:@CacheConfig(cacheNames = {"emp"},cacheManager = "employeeCacheManager")

Apéndice ampliar: el uso de la expresión SpEL

SpEL caché de metadatos disponibles

nombre ubicación descripción Ejemplos
methodName el objeto raíz El método actual se llama nombre # root.methodname
método el objeto raíz El método actual se llama # root.method.name
objetivo el objeto raíz El objeto de destino actual se llama una instancia # root.target
targetClass el objeto raíz La clase actual se llama el objeto de destino # root.targetClass
args el objeto raíz Lista de parámetros se llama el método actual # root.args [0]
cachés el objeto raíz Las llamadas a los métodos actuales de uso de la lista de caché # Root.caches [0] .name
Nombre argumento contexto de ejecución (contexto dedicadas a la evaluación) Parámetros del método se llama una corriente, tal como findArtisan (Artisan artesano), los parámetros se pueden obtener por artsian.id # # artsian.id
resultado contexto de ejecución (contexto de evaluación) El valor de retorno después de la ejecución del método (único método eficaz para realizar la determinación, a menos cacheEvict como el beforeInvocation = FALSE) #resultado

En cuarto lugar, la memoria caché integrada Redis

4.1 listo Ambiental

Basado en el medio ambiente caché primavera anterior, para introducir la configuración redis integrado:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

el modo de caché se conmuta Redis:spring.cache.type=redis
Aquí Insertar imagen Descripción

4.2, implementos clase de configuración Redis

Configuración RedisTemplate

@Resource
    private LettuceConnectionFactory lettuceConnectionFactory;

    @Bean
    @Primary
    public RedisTemplate<Object,Object> redisTemplate(){
        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<Object, Object>();
        redisTemplate.setConnectionFactory(lettuceConnectionFactory);
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = this.initJacksonSerializer();
        // 设置value的序列化规则和 key的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

código de referencia relacionado puede RedisCacheManager Bowen, el blogger ha hecho un paquete de código buena, así que esto no es código duplicado

4.3, las operaciones relacionadas RestTemplate

Redis operación Uso RestTemplate

  • 1, redisTemplate.opsForValue (); // operaciones de Cuerda
  • 2, redisTemplate.opsForHash (); // 操作 de hash
  • 3, redisTemplate.opsForList (); // lista 操作
  • 4, redisTemplate.opsForSet (); // 操作 conjunto
  • 5, redisTemplate.opsForZSet (); // operaciones en el conjunto ordenado

4.4, la prueba de servicio de caché

@Autowired
    DepartmentMapper departmentMapper;

    @Qualifier("redisCacheManager")
    @Autowired
    RedisCacheManager redisCacheManager;

//      @Cacheable(cacheNames = "dept",cacheManager = "redisCacheManager")
//    public Department getDeptById(Integer id){
//        System.out.println("查询部门"+id);
//        Department department = departmentMapper.getDeptById(id);
//        return department;
//    }

    // 使用缓存管理器得到缓存,进行api调用
   public Department getDeptById(Integer id){
        LOG.info("查询id为{}的员工信息",id);

        //获取某个缓存
        Cache deptCache = redisCacheManager.getCache("dept");
        Department department = null;
        if(deptCache.get(id)==null){
            department = departmentMapper.getDeptById(id);
            deptCache.put(id,department);
        } else {
            SimpleValueWrapper valueWrapper = (SimpleValueWrapper) deptCache.get(id);
            department = (Department)valueWrapper.get();
        }

        return department;
    }

Aquí Insertar imagen Descripción

Por supuesto, el uso de la anterior caché primaria primavera clave también son posibles,
Aquí Insertar imagen Descripción
con referencia a Bowen:
Cache Cache operación de combate capa de abstracción de la primavera

Descargar ejemplos de código: enlace GitHub

Supongo que te gusta

Origin www.cnblogs.com/mzq123/p/12629142.html
Recomendado
Clasificación