package com.jt.blog.config;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.lang.reflect.Method;
import java.time.Duration;
/**
* 初始化一个Cache管理器对象
*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
// 用目标的包名target,方法名method,类名params自动生成一个自定义的key
@Override
@Bean
public KeyGenerator keyGenerator(){
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder stringBuilder = new StringBuilder();
/*按照什么定义生成key*/
//加入类全名
stringBuilder.append(target.getClass().getName());
//分隔符
stringBuilder.append(":");
//方法名
stringBuilder.append(method.getName());
//分隔符
stringBuilder.append(":");
//对象名,将对象名以“+”进行拼接
for(Object param:params){
stringBuilder.append(param);
stringBuilder.append("+");
}
return stringBuilder.toString();
}
};
}
//设置CacheManager缓存规则
@Bean
public CacheManager cacheManager(RedisConnectionFactory connectionFactory){
RedisCacheConfiguration configuration =
RedisCacheConfiguration.defaultCacheConfig();
configuration.entryTtl(Duration.ofSeconds(60))
//key的序列化,使用StringRedisSerializer序列化
.serializeKeysWith(
RedisSerializationContext.SerializationPair.
fromSerializer(new StringRedisSerializer()) )
//值的序列化,使用Jackson2JsonRedisSerializer序列化
.serializeValuesWith(
RedisSerializationContext.SerializationPair.fromSerializer(
new Jackson2JsonRedisSerializer<Object>(Object.class)))
.disableCachingNullValues();
return RedisCacheManager
.builder(connectionFactory)
.cacheDefaults(configuration)
.transactionAware()
.build();
}
//设置RedisTemplate规则
@Bean
public RedisTemplate<Object,Object>
redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer =
new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换拿异常的问题
ObjectMapper objectMapper = new ObjectMapper();
//指定序列化输入的域,field,get和set以及修饰范围,ANY是都有包括private和public
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//指定序列化输入的类型,类必须是非final修饰的,比如String,Integer等会抛出异常
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//序列号key value
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
04-30
1万+
09-06
1077
11-30
4万+