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
* * @Description: Redis工具类
* @Project:
* @CreateDate: Created in 2020/2/4 16:05
* @Author: liuke */ @EnableConfigurationProperties({RedisProperties.class, CacheManagerProperties.class}) @EnableCaching public class RedisAutoConfigure { @Autowired private CacheManagerProperties cacheManagerProperties; /** * RedisTemplate配置 * * @param factory */ @Bean public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate 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 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 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())); } }