一、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
}
五、打完收功~
