SpringBoot estudio especial Part26: la integración de Primavera caché Redis e implementar el almacenamiento en caché nueva versión 2.x SpringBoot CacheManager personalizada

Primavera caché se utiliza por el administrador de ConcurrentMapCacheManager por defecto
creado es ConcurrentMapCache datos de la caché se almacena en el ConcurrentMap

El uso real del middleware de caché será más ocasiones como Redis Ehcache etc.

Redis es una red basada en memoria de alto rendimiento también puede apoyar persistente tipo de base de datos de registro de valores-clave

configuración por defecto de primavera caché es SimpleCacheConfiguration esta clase
, por supuesto, hay muchas otras clases de configuración (el valor por defecto no está activada
cuando los correspondientes importación caché otras escenas para abrir automáticamente la configuración de la caché correspondientes

Uno, arreglo

En primer lugar, si no se instala en la máquina se puede utilizar Redis Redis montado acoplable

# 拉取最新redis镜像
docker pull docker.mirrors.ustc.edu.cn/library/redis

#启动redis容器
docker run -d -p 6379:6379 --name redis1 docker.mirrors.ustc.edu.cn/library/redis

Por supuesto, su propia instalación y configuración también pueden ser Redis

Luego, en el proyecto para introducir el ReDiS de arranque (arranque):

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

Luego, en el fichero de configuración para configurar el host de Redis ip :

spring.redis.host=111.111.111.111(主机ip)

Después de la introducción de la Redis de arranque (iniciador) RedisAutoConfiguration esta clase de configuración inicia la
configuración subyacente de RedisTemplate y StringRedisTemplate estas dos clases de plantilla para la operación es similar a la JDBC Redis JdbcTemplate
de la inyección puede simplemente utilizar

StringRedisTemplate definición es la cadena de funcionamiento
y RedisTemplate se utiliza para manipular el objeto

En segundo lugar, el uso

Redis común de cinco Tipo de datos: Cadena Cadena de lista de Conjunto de hash Hash zConfigurar ordenado conjunto de recopilación
método tiene una plantilla correspondientes
stringRedisTemplate.opsForValue(): las operaciones de cadena kv
stringRedisTemplate.opsForList(): Lista de operaciones
stringRedisTemplate.opsForSet(): conjunto de operaciones
stringRedisTemplate.opsForHash(): la operación de hash
stringRedisTemplate.opsForZSet(): funcionamiento conjunto ordenado
redisTemplate también tiene estos método

1, la manipulación de cadenas

// 添加key-value
stringRedisTemplate.opsForValue().append("msg","HelloWorld");
// 通过key获取指定的value
System.out.println(stringRedisTemplate.opsForValue().get("msg"));

// 往list左侧添加
stringRedisTemplate.opsForList().leftPush("mylist","1");
stringRedisTemplate.opsForList().leftPush("mylist","2");
stringRedisTemplate.opsForList().leftPush("mylist","3");

Redis sintaxis y concreto es el mismo, pero más elaborado

2, el objetivo de la operación

Employee employee = employeeMapper.findEmployeeById(1);
redisTemplate.opsForValue().set("emp1",employee);

En este momento ser dado: Causado por: java.lang.IllegalArgumentException: DefaultSerializer requiere una carga útil Serializable pero recibió un objeto de tipo [net.zjitc.springboot.bean.Employee]
Debido a la necesidad de pasar la clase se puede serializar y se almacena en la clase no puede ser serializado quedando así determinado
la necesidad de lograr en la clase de entidad serializable serializable interfaz es solamente una declaración en nombre de la clase puede ser serializado y nada más

public class Employee implements Serializable {
	
	private Integer id;
	private String lastName;
	private String email;
	private Integer gender;
	private Integer dId;

    ...
}

Tales objetos pueden ser adecuadamente almacenados en un Redis

Almacenamiento problema de la basura:

El valor predeterminado es para guardar el objeto usando mecanismo de serialización JDK para guardar los datos en la secuencia de los Redis
lo que los datos van a ahorrar mucho más, tal como \xAC\xED\x00\x05sr\x00ilegible tales
Aquí Insertar imagen Descripción

Por lo general, se utiliza generalmente en los datos JSON almacenada en forma de
dos métodos de conversión se puede realizar:

  • 1, vamos a tener una gran cantidad de objetos en herramientas de conversión de JSON a elegir, como Fastjson
  • 2, utilizando las reglas de secuencia predeterminada RedisTemplate

Muchas de las secuencias definidas en RedisTemplate usando por defecto JdkSerializationRedisSerializer
sólo se necesita cambiar como JSON serializador
encargo ReDiS una clase de configuración:

@Configuration
public class MyRedisConfig {

    @Bean
    public RedisTemplate<Object, Employee> empRedisTemplate(
            RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Employee> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        // 传入要转换为JSON的类的class
        Jackson2JsonRedisSerializer<Employee> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Employee>(Employee.class);
        template.setDefaultSerializer(jackson2JsonRedisSerializer);

        return template;
    }
}

Una vez configurada la inyección puede ser utilizado en clase:

// 注入
@Autowired
RedisTemplate<Object, Employee> empRedisTemplate;

// 使用
Employee employee = employeeMapper.findEmployeeById(1);
empRedisTemplate.opsForValue().set("emp1",employee);

Aquí Insertar imagen Descripción
perfecto


En tercer lugar, a medida CacheManager

De hecho, el principio es CacheManager Administrador de caché para crear caché componente caché
y luego las operaciones CRUD reales por componente Cache cache

Redis de arranque después de la introducción del motor de arranque a través del interior del recipiente se determina automáticamente utilizando RedisCacheManager (Redis Cache Manager)
RedisCacheManager RedisCache creado por el funcionamiento del componente de almacenamiento en caché Redis como memoria caché para datos de los componentes de caché
que pasa configura automáticamente
simplemente disfrutar de ella

Pero…

Cuando se utiliza el almacenamiento en caché abstracción anotaciones SpringCache cuando se introduce Redis implementar la caché de arranque (arranque)
son los datos de la memoria caché @Cacheable se almacena automáticamente en Redis

Sin embargo, ganso por defecto o JDK se utiliza para almacenar una secuencia de la Redis o ilegible!
Entonces, ¿cómo los datos almacenados como JSON?

CacheManager después de la introducción del motor de arranque por defecto Redis es RedisCacheManager
utilizar la operación RedisCacheManager predeterminado se crea cuando el Redis RedisTemplate<Object,Object>Nota es genérico de objetos, objeto
del defecto y RedisTemplate<Object,Object>mecanismo de serialización utilizado es el JdkSerializationRedisSerializer que conduce al almacenamiento (chino ) ilegible

En este caso la necesidad de personalizar CacheManager
agrega al contenedor en una clase CacheManager de configuración:

// 定制缓存管理器规则
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    //初始化RedisCacheWriter
    RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
    //设置CacheManager的序列化方式为JSON
    RedisSerializer<Object> jsonSerializer = new GenericJackson2JsonRedisSerializer();
    RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair
            .fromSerializer(jsonSerializer);
    RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig()
            .serializeValuesWith(pair);

    //设置默认超时过期时间
    //    defaultCacheConfig.entryTtl(Duration.ofSeconds(30));

    return new RedisCacheManager(redisCacheWriter, defaultCacheConfig);
}

La entrada CacheManager defecto en vigor cuando el recipiente no es CacheManager CacheManager por lo tanto, he escrito Una vez añadido al recipiente tomar automáticamente efecto
usando el valor predeterminado prefijo es la propiedad cacheNames valor por defecto anotado como una tecla prefijo es la clave para evitar la repetición
Aquí Insertar imagen Descripción


Una forma codificada, utilice el administrador de caché

Las anotaciones también se pueden utilizar no sólo forma de operar gestor de codificación caché separado:
primera inyección Administrador de caché puede ser utilizado directamente (por supuesto, la premisa de que ya se ha personalizado la CacheManager si desea almacenar palabras Redis formato JSON)

// 缓存管理器
@Autowired
CacheManager cacheManager;

public Department getDepartmentById(Integer id)
{
        System.out.println("查询"+id+"部门");
        Department employee = departmentMapper.findEmployeeById(id);

        // 获取一个指定名称的缓存
        Cache dept = cacheManager.getCache("dept");
        // 对指定缓存进行操作 会自动添加前缀
        dept.put(id,employee);

        return employee;
}

Aquí Insertar imagen Descripción


Publicados 174 artículos originales · ganado elogios 5 · Vistas de 240.000 +

Supongo que te gusta

Origin blog.csdn.net/Piconjo/article/details/105189645
Recomendado
Clasificación