package com.kidgrow.redis;
|
|
import com.kidgrow.redis.properties.CacheManagerProperties;
|
import com.kidgrow.redis.template.RedisRepository;
|
import com.kidgrow.redis.util.RedisObjectSerializer;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.cache.CacheManager;
|
import org.springframework.cache.annotation.EnableCaching;
|
import org.springframework.cache.interceptor.KeyGenerator;
|
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Primary;
|
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.core.RedisTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
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;
|
|
/**
|
* 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br>
|
*
|
* @Description: Redis工具类<br>
|
* @Project: <br>
|
* @CreateDate: Created in 2020/2/4 16:05 <br>
|
* @Author: <a href="4345453@kidgrow.com">liuke</a>
|
*/
|
@EnableConfigurationProperties({RedisProperties.class, CacheManagerProperties.class})
|
@EnableCaching
|
public class RedisAutoConfigure {
|
@Autowired
|
private CacheManagerProperties cacheManagerProperties;
|
|
/**
|
* RedisTemplate配置
|
*
|
* @param factory
|
*/
|
@Bean
|
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
|
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
|
redisTemplate.setConnectionFactory(factory);
|
|
RedisSerializer stringSerializer = new StringRedisSerializer();
|
RedisSerializer redisObjectSerializer = new RedisObjectSerializer();
|
redisTemplate.setKeySerializer(stringSerializer);
|
redisTemplate.setHashKeySerializer(stringSerializer);
|
redisTemplate.setValueSerializer(redisObjectSerializer);
|
redisTemplate.afterPropertiesSet();
|
return redisTemplate;
|
}
|
|
/**
|
* StringRedisTemplate配置
|
*
|
* @param factory 连接工厂
|
* @return StringRedisTemplate
|
*/
|
@Bean
|
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
|
return new StringRedisTemplate(factory);
|
}
|
|
/**
|
* Redis repository redis repository.
|
*
|
* @param redisTemplate the redis template
|
* @return the redis repository
|
*/
|
@Bean
|
@ConditionalOnMissingBean
|
public RedisRepository redisRepository(RedisTemplate<String, Object> redisTemplate) {
|
return new RedisRepository(redisTemplate);
|
}
|
|
@Bean(name = "cacheManager")
|
@Primary
|
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
|
RedisCacheConfiguration difConf = getDefConf().entryTtl(Duration.ofHours(1));
|
|
//自定义的缓存过期时间配置
|
int configSize = cacheManagerProperties.getConfigs() == null ? 0 : cacheManagerProperties.getConfigs().size();
|
Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>(configSize);
|
if (configSize > 0) {
|
cacheManagerProperties.getConfigs().forEach(e -> {
|
RedisCacheConfiguration conf = getDefConf().entryTtl(Duration.ofSeconds(e.getSecond()));
|
redisCacheConfigurationMap.put(e.getKey(), conf);
|
});
|
}
|
|
return RedisCacheManager.builder(redisConnectionFactory)
|
.cacheDefaults(difConf)
|
.withInitialCacheConfigurations(redisCacheConfigurationMap)
|
.build();
|
}
|
|
@Bean
|
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();
|
};
|
}
|
|
private RedisCacheConfiguration getDefConf() {
|
return RedisCacheConfiguration.defaultCacheConfig()
|
.disableCachingNullValues()
|
.computePrefixWith(cacheName -> "cache".concat(":").concat(cacheName).concat(":"))
|
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
|
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new RedisObjectSerializer()));
|
}
|
}
|