springboot多态_springboot2.x redis缓存配置

本文对比分析了SpringBoot 1.5.x和2.x版本中Redis缓存的配置差异,包括依赖引入、YAML配置、连接池类型、序列化方式以及缓存过期时间设置。在2.x版本中,Redis客户端连接池类型默认改为Lettuce,配置有所调整,同时在按需配置中详细展示了如何创建RedisTemplate、CacheManager以及KeyGenerator。
摘要由CSDN通过智能技术生成

从配置最明显的来看,RedisCacheManager类初始化不再以RedisTemplate为参数进行初始化,顺带引起了一些变化,遂记录于此。

一. springboot 1.5.x 版本

1. 引入依赖

org.springframework.boot

spring-boot-starter-data-redis

1.5.2.RELEASE

2. application.yml/properties配置

spring:

cache:

type: redis

redis:

host: 127.0.0.1

port: 6379

timeout: 0

database: 0

pool:

max-active: 8

max-wait: -1

max-idle: 8

min-idle: 0

到此springboot可以以通用方式配置redis缓存了。但是如果需要特殊处理,则需要自己利用代码进行配置了,比如 序列与反序列化方式, redis缓存key的生成方案等等。

3. 按需配置

/**

* Created by xiaoyiyiyo on 2018/4/28.

*/

@EnableCaching

@Configuration

public class RedisCacheConfig extends CachingConfigurerSupport{

@Bean

public RedisTemplate redisTemplate() {

Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);

//全局开关,支持jackson在反序列是使用多态

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(om);

StringRedisTemplate redisTemplate = new StringRedisTemplate();

redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);

return redisTemplate;

}

@Bean

public CacheManager cacheManager(RedisTemplate redisTemplate) {

RedisCacheManager manager = new RedisCacheManager(redisTemplate);

manager.setUsePrefix(true);

RedisCachePrefix cachePrefix = new RedisPrefix("prefix");

manager.setCachePrefix(cachePrefix);

// 整体缓存过期时间

manager.setDefaultExpiration(3600L);

// 设置缓存过期时间。key和缓存过期时间,单位秒

Map expiresMap = new HashMap<>();

expiresMap.put("user", 1000L);

manager.setExpires(expiresMap);

return manager;

}

/**

* 缓存的key是 包名+方法名+参数列表

*/

@Bean

@Override

public KeyGenerator keyGenerator() {

return (target, method, objects) -> {

StringBuilder sb = new StringBuilder();

sb.append(target.getClass().getName());

sb.append("::" + method.getName() + ":");

for (Object obj : objects) {

sb.append(obj.toString());

}

return sb.toString();

};

}

}

二. springboot 2.x 版本

1. 引入依赖

同1.5.x

2. application.yml/properties配置

2.x版本默认redis客户端连接池类型有所不同。

版本

默认客户端类型

1.5.x

jedis

2.x

lettuce

所以配置连接池的时候会有不同,如下:

application.yml

#2.x版本中由于引入了不同客户端,需要指定配置哪种连接池

#jedis客户端

spring:

cache:

type: redis

redis:

host: 127.0.0.1

port: 6379

timeout: 0

database: 0

jedis:

pool:

max-active: 8

max-wait: -1ms

max-idle: 8

min-idle: 0

3. 按需配置

package com.xiaoyiyiyo.configuration;

@Bean

public ObjectMapper objectMapper() {

ObjectMapper om = new ObjectMapper();

om.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); //补上

return om;

}

@Bean

public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer (ObjectMapper om) {

GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(om);

return serializer;

}

@Bean

public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory,

GenericJackson2JsonRedisSerializer serializer) {

RedisTemplate redisTemplate = new RedisTemplate();

redisTemplate.setConnectionFactory(redisConnectionFactory);

RedisSerializer stringSerializer = new StringRedisSerializer();

redisTemplate.setKeySerializer(stringSerializer);//key序列化

redisTemplate.setValueSerializer(serializer);//value序列化

redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化

redisTemplate.setHashValueSerializer(serializer);//Hash value序列化

redisTemplate.afterPropertiesSet();

return redisTemplate;

}

@Bean

public CacheManager cacheManager(RedisTemplate redisTemplate ) {

RedisCacheManager manager = new RedisCacheManager(redisTemplate);

manager.setUsePrefix(true);

// 整体缓存过期时间

manager.setDefaultExpiration(3600L);

// 设置缓存过期时间。key和缓存过期时间,单位秒

Map expiresMap = new HashMap<>();

expiresMap.put("user", 1000L);

manager.setExpires(expiresMap);

return manager;

}

// @Bean

// public RedisCacheConfiguration redisCacheConfiguration(GenericJackson2JsonRedisSerializer serializer) {

// return RedisCacheConfiguration

// .defaultCacheConfig()

// .serializeKeysWith(

// RedisSerializationContext

// .SerializationPair

// .fromSerializer(new StringRedisSerializer()))

// .serializeValuesWith(

// RedisSerializationContext

// .SerializationPair

// .fromSerializer(serializer));

// }

@Bean

@Override

public KeyGenerator keyGenerator() {

return (target, method, objects) -> {

StringBuilder sb = new StringBuilder();

sb.append(target.getClass().getName());

sb.append("::" + method.getName() + ":");

for (Object obj : objects) {

sb.append(obj.toString());

}

return sb.toString();

};

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值