SpringBoot通过Cacheable注解完成redis缓存功能
⼀、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 t.annotation.Bean;
import t.annotation.Configuration;
import org.dis.cache.*;
import org.tion.RedisConnectionFactory;
import org.dis.serializer.GenericJackson2JsonRedisSerializer;
import org.dis.serializer.RedisSerializationContext;
import ansaction.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 = LockingRedisCacheWriter(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, initialCacheNames) {
super(cacheWriter, defaultCacheConfiguration, initialCacheNames);
}
public CustomizeTtlRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration de
faultCacheConfiguration, boolean allowInFlightCacheCreation, 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 = Ttl(ttl);
}
//修改缓存key和value值的序列化⽅式
cacheConfig = cacheConfigputePrefixWith(DEFAULT_CACHE_KEY_PREFIX)
.serializeValuesWith(DEFAULT_PAIR);
ateRedisCache(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) {
cacheableString 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
}
五、打完收功~

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。