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);
|
}
|
|
}
|