@Cacheable 过期时间啊
时间: 2023-11-25 07:51:59 浏览: 120
在使用@Cacheable时,可以通过自定义RedisCacheManager来实现ttl设置。具体步骤如下:
1.创建RedisCacheManager的子类,重写createCache方法,设置缓存过期时间。
```java
public class MyRedisCacheManager extends RedisCacheManager {
public MyRedisCacheManager(RedisOperations redisOperations) {
super(redisOperations);
}
@Override
protected RedisCache createCache(String cacheName) {
// 获取缓存过期时间
long ttl = getTtl(cacheName);
// 创建RedisCache对象,并设置过期时间
return new RedisCache(cacheName, (isUsePrefix() ? getCachePrefix().prefix(cacheName) : null),
getRedisOperations(), ttl);
}
// 获取缓存过期时间
private long getTtl(String cacheName) {
// 从缓存名称中获取过期时间
String[] cacheParams = cacheName.split("=");
if (cacheParams.length > 1) {
String ttlStr = cacheParams[1];
try {
return Long.parseLong(ttlStr);
} catch (NumberFormatException e) {
// 如果解析失败,则返回默认过期时间
return computeExpiration(cacheName);
}
} else {
// 如果没有设置过期时间,则返回默认过期时间
return computeExpiration(cacheName);
}
}
}
```
2.在配置类中注入MyRedisCacheManager,并将其设置为缓存管理器。
```java
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
@Bean
public RedisCacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
MyRedisCacheManager cacheManager = new MyRedisCacheManager(redisTemplate);
// 设置默认过期时间
cacheManager.setDefaultExpiration(60);
return cacheManager;
}
}
```
3.在使用@Cacheable注解时,设置缓存名称和过期时间。
```java
@Cacheable(value = "p_user=600", key = "#menu+'_'+#type+'_'+#userId", cacheManager = "cacheManager", unless = "#result == null")
public User getUser(String menu, String type, String userId) {
// ...
}
```
在上述代码中,@Cacheable注解中的value属性设置为"p_user=600",表示缓存名称为"p_user",过期时间为600秒。
阅读全文