对比新文件 |
| | |
| | | package com.iailab.framework.redis.config; |
| | | |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.iailab.framework.redis.core.TimeoutRedisCacheManager; |
| | | import org.springframework.boot.autoconfigure.AutoConfiguration; |
| | | import org.springframework.boot.autoconfigure.cache.CacheProperties; |
| | | import org.springframework.boot.context.properties.EnableConfigurationProperties; |
| | | import org.springframework.cache.annotation.EnableCaching; |
| | | import org.springframework.context.annotation.Bean; |
| | | import org.springframework.context.annotation.Primary; |
| | | import org.springframework.data.redis.cache.BatchStrategies; |
| | | 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.RedisSerializationContext; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import java.util.Objects; |
| | | |
| | | import static com.iailab.framework.redis.config.IailabRedisAutoConfiguration.buildRedisSerializer; |
| | | |
| | | /** |
| | | * Cache 配置类,基于 Redis 实现 |
| | | */ |
| | | @AutoConfiguration |
| | | @EnableConfigurationProperties({CacheProperties.class, IailabCacheProperties.class}) |
| | | @EnableCaching |
| | | public class IailabCacheAutoConfiguration { |
| | | |
| | | /** |
| | | * RedisCacheConfiguration Bean |
| | | * <p> |
| | | * 参考 org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration 的 createConfiguration 方法 |
| | | */ |
| | | @Bean |
| | | @Primary |
| | | public RedisCacheConfiguration redisCacheConfiguration(CacheProperties cacheProperties) { |
| | | RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); |
| | | // 设置使用 : 单冒号,而不是双 :: 冒号,避免 Redis Desktop Manager 多余空格 |
| | | // 详细可见 https://blog.csdn.net/chuixue24/article/details/103928965 博客 |
| | | // 再次修复单冒号,而不是双 :: 冒号问题,Issues 详情:https://gitee.com/zhijiantianya/iailab-cloud/issues/I86VY2 |
| | | config = config.computePrefixWith(cacheName -> { |
| | | String keyPrefix = cacheProperties.getRedis().getKeyPrefix(); |
| | | if (StringUtils.hasText(keyPrefix)) { |
| | | keyPrefix = keyPrefix.lastIndexOf(StrUtil.COLON) == -1 ? keyPrefix + StrUtil.COLON : keyPrefix; |
| | | return keyPrefix + cacheName + StrUtil.COLON; |
| | | } |
| | | return cacheName + StrUtil.COLON; |
| | | }); |
| | | // 设置使用 JSON 序列化方式 |
| | | config = config.serializeValuesWith( |
| | | RedisSerializationContext.SerializationPair.fromSerializer(buildRedisSerializer())); |
| | | |
| | | // 设置 CacheProperties.Redis 的属性 |
| | | CacheProperties.Redis redisProperties = cacheProperties.getRedis(); |
| | | if (redisProperties.getTimeToLive() != null) { |
| | | config = config.entryTtl(redisProperties.getTimeToLive()); |
| | | } |
| | | if (!redisProperties.isCacheNullValues()) { |
| | | config = config.disableCachingNullValues(); |
| | | } |
| | | if (!redisProperties.isUseKeyPrefix()) { |
| | | config = config.disableKeyPrefix(); |
| | | } |
| | | return config; |
| | | } |
| | | |
| | | @Bean |
| | | public RedisCacheManager redisCacheManager(RedisTemplate<String, Object> redisTemplate, |
| | | RedisCacheConfiguration redisCacheConfiguration, |
| | | IailabCacheProperties iailabCacheProperties) { |
| | | // 创建 RedisCacheWriter 对象 |
| | | RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory()); |
| | | RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, |
| | | BatchStrategies.scan(iailabCacheProperties.getRedisScanBatchSize())); |
| | | // 创建 TenantRedisCacheManager 对象 |
| | | return new TimeoutRedisCacheManager(cacheWriter, redisCacheConfiguration); |
| | | } |
| | | |
| | | } |