All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.dreamlu.mica.redis.config.MicaRedisCacheAutoConfiguration Maven / Gradle / Ivy

There is a newer version: 3.3.2
Show newest version
/*
 * Copyright (c) 2019-2029, Dreamlu 卢春梦 ([email protected] & www.dreamlu.net).
 * 

* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *

* http://www.gnu.org/licenses/lgpl.html *

* Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.dreamlu.mica.redis.config; import net.dreamlu.mica.core.utils.CharPool; import net.dreamlu.mica.core.utils.StringPool; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration; import org.springframework.boot.autoconfigure.cache.CacheManagerCustomizers; import org.springframework.boot.autoconfigure.cache.CacheProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; 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.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.lang.Nullable; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; /** * 扩展redis-cache支持注解cacheName添加超时时间 *

* * @author L.cm */ @EnableCaching @AutoConfiguration(before = CacheAutoConfiguration.class) @EnableConfigurationProperties(CacheProperties.class) public class MicaRedisCacheAutoConfiguration { /** * 序列化方式 */ private final RedisSerializer redisSerializer; private final CacheProperties cacheProperties; private final CacheManagerCustomizers customizerInvoker; @Nullable private final RedisCacheConfiguration redisCacheConfiguration; MicaRedisCacheAutoConfiguration(RedisSerializer redisSerializer, CacheProperties cacheProperties, CacheManagerCustomizers customizerInvoker, ObjectProvider redisCacheConfiguration) { this.redisSerializer = redisSerializer; this.cacheProperties = cacheProperties; this.customizerInvoker = customizerInvoker; this.redisCacheConfiguration = redisCacheConfiguration.getIfAvailable(); } @Primary @Bean("cacheResolver") public CacheManager redisCacheManager(ObjectProvider connectionFactoryObjectProvider) { RedisConnectionFactory connectionFactory = connectionFactoryObjectProvider.getIfAvailable(); Objects.requireNonNull(connectionFactory, "Bean RedisConnectionFactory is null."); RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory); RedisCacheConfiguration cacheConfiguration = this.determineConfiguration(); List cacheNames = this.cacheProperties.getCacheNames(); Map initialCaches = new LinkedHashMap<>(); if (!cacheNames.isEmpty()) { Map cacheConfigMap = new LinkedHashMap<>(cacheNames.size()); cacheNames.forEach(it -> cacheConfigMap.put(it, cacheConfiguration)); initialCaches.putAll(cacheConfigMap); } boolean allowInFlightCacheCreation = true; boolean enableTransactions = false; RedisAutoCacheManager cacheManager = new RedisAutoCacheManager( redisCacheWriter, cacheConfiguration, allowInFlightCacheCreation, initialCaches ); cacheManager.setTransactionAware(enableTransactions); return this.customizerInvoker.customize(cacheManager); } private RedisCacheConfiguration determineConfiguration() { if (this.redisCacheConfiguration != null) { return this.redisCacheConfiguration; } else { CacheProperties.Redis redisProperties = this.cacheProperties.getRedis(); RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); // 设置默认缓存名分割符号为 “:”,如果已经带 “:” 则不设置。 config = config.computePrefixWith(name -> name.endsWith(StringPool.COLON) ? name : name + CharPool.COLON); config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)); if (redisProperties.getTimeToLive() != null) { config = config.entryTtl(redisProperties.getTimeToLive()); } if (redisProperties.getKeyPrefix() != null) { config = config.prefixCacheNameWith(redisProperties.getKeyPrefix()); } if (!redisProperties.isCacheNullValues()) { config = config.disableCachingNullValues(); } if (!redisProperties.isUseKeyPrefix()) { config = config.disableKeyPrefix(); } return config; } } }