package com.dh.common.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
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.cache.RedisCacheWriter;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
/**
* @author WeiCui
* @Description 小虎鲸官网
* @date 2020/11/2 15:20
* @Version 1.0
*/
@Configuration
@EnableCaching
public class CacheConfig{
@Value("${spring.cache.redis.time-to-live}")
private Long expireTime;
@Value("#{${cache.keys}}")
private Map<String,Long> keys;
@Bean(name = "redisTemplate")
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(keySerializer());
redisTemplate.setHashKeySerializer(keySerializer());
redisTemplate.setValueSerializer(valueSerializer());
redisTemplate.setHashValueSerializer(valueSerializer());
return redisTemplate;
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
//默认缓存配置对象
RedisCacheConfiguration redisCacheDefaultConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheDefaultConfiguration = redisCacheDefaultConfiguration.entryTtl(Duration.ofSeconds(expireTime)) //设置缓存的默认超时时间
.disableCachingNullValues() //如果是空值,不缓存
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer())) //设置key序列化器
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer((valueSerializer()))); //设置value序列化器
if(this.keys!=null&&!this.keys.isEmpty()){
Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
for (String key : keys.keySet()) {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig().serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(keySerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(valueSerializer()))
.disableCachingNullValues()
.entryTtl(Duration.ofSeconds(keys.get(key)));
cacheConfigurations.put(key,redisCacheConfiguration);
}
return new RedisCacheManager(RedisCacheWriter.lockingRedisCacheWriter(redisConnectionFactory),redisCacheDefaultConfiguration,cacheConfigurations);
}else {
return new RedisCacheManager(RedisCacheWriter.lockingRedisCacheWriter(redisConnectionFactory),redisCacheDefaultConfiguration);
}
}
private RedisSerializer<String> keySerializer() {
return new StringRedisSerializer();
}
private RedisSerializer<Object> valueSerializer() {
return new GenericJackson2JsonRedisSerializer();
}
}
配置文件:application-catch.yml
cache: #缓存key keys: "{ key1: 864000, key1: 864000, key1: 864000, }"
用法:
@Cacheable(value = "key1",key = "'id'+#id",unless="#result == null")
public TbMember findOneMemberByid(String id) {
//此处逻辑代码
}