一、pom文件引入所需jar
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
二、yml文件配置
1 spring: 2 redis: 3 host: 192.168.80.88 4 port: 6379 5 password: 6 database: 6 7 timeout: 2000ms 8 jedis: 9 pool: 10 max-idle: 20 11 max-wait: 1000ms 12 max-active: 100
三、config配置
import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.*; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.transaction.annotation.EnableTransactionManagement; import java.time.Duration; import java.util.Map; /** * @Description: redis緩存配置: 重載redisCacheManager實現過期時間可配置 **/ @Configuration @EnableTransactionManagement @CacheConfig @EnableCaching public class RedisCacheConfig { @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { //初始化一個RedisCacheWriter RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); //初始化一個RedisCacheConfiguration RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig(); //返回一個自定義的CacheManager return new CustomizeTtlRedisCacheManager(redisCacheWriter, defaultCacheConfig); } } /** * @Description: 重載redisCacheManager-從cacheName中提取過期時間進行配置 **/ class CustomizeTtlRedisCacheManager extends RedisCacheManager { public CustomizeTtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) { super(cacheWriter, defaultCacheConfiguration); } public CustomizeTtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration, String... initialCacheNames) { super(cacheWriter, defaultCacheConfiguration, initialCacheNames); } public CustomizeTtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration, boolean allowInFlightCacheCreation, String... initialCacheNames) { super(cacheWriter, defaultCacheConfiguration, allowInFlightCacheCreation, initialCacheNames); } public CustomizeTtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration, Map<String, RedisCacheConfiguration> initialCacheConfigurations) { super(cacheWriter, defaultCacheConfiguration, initialCacheConfigurations); } public CustomizeTtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration, Map<String, RedisCacheConfiguration> initialCacheConfigurations, boolean allowInFlightCacheCreation) { super(cacheWriter, defaultCacheConfiguration, initialCacheConfigurations, allowInFlightCacheCreation); } @Override protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { Duration ttl = getTtlByName(name); if (ttl != null) { //證明在cacheName上使用了過期時間,需要修改配置中的ttl cacheConfig = cacheConfig.entryTtl(ttl); } //修改緩存key和value值的序列化方式 cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX) .serializeValuesWith(DEFAULT_PAIR); return super.createRedisCache(name, cacheConfig); } /** * 緩存參數的分隔符 * 數組元素0=緩存的名稱 * 數組元素1=緩存過期時間TTL */ private static final String DEFAULT_SEPARATOR = "#"; /** * 通過name獲取過期時間 * * @param name * @return */ private Duration getTtlByName(String name) { if (name == null) { return null; } //根據分隔符拆分字符串,並進行過期時間ttl的解析 String[] cacheParams = name.split(DEFAULT_SEPARATOR); if (cacheParams.length > 1) { String ttl = cacheParams[1]; if (!StringUtils.isEmpty(ttl)) { try { return Duration.ofSeconds(Long.parseLong(ttl)); } catch (Exception e) { // TODO } } } return null; } /** * 默認的key前綴 */ private static final CacheKeyPrefix DEFAULT_CACHE_KEY_PREFIX = cacheName -> cacheName + ":"; /** * 默認序列化方式為json */ private static final RedisSerializationContext.SerializationPair<Object> DEFAULT_PAIR = RedisSerializationContext.SerializationPair .fromSerializer(new GenericJackson2JsonRedisSerializer()); }
四、使用注解
/**cacheNames中的"#30"表示緩存過期時間為30秒 */ @Cacheable(cacheNames = "testMethod#30", unless = "#result==null") public String testMethod(String param) { // TODO }
五、打完收功~