从配置最明显的来看,RedisCacheManager类初始化不再以RedisTemplate为参数进行初始化,顺带引起了一些变化,遂记录于此。
一. springboot 1.5.x 版本
1. 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
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<String, Long> 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<String, Object> redisTemplate = new RedisTemplate<String, Object>();
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<String, Long> 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();
};
}