我有使用redis-server进行缓存存储的spring微服务应用程序。 使用RedisCacheManager Api。在此我们可以选择设置“ setDefaultExpiration ”。因为rediscachemanager计算从第一次访问带注释的方法( @cacheable )到期。
我想计算上次访问可缓存方法的到期时间,而不是第一次访问。 谷歌图书馆已经给出了直接的方法: 在 CacheBuilder 中,我们有一个名为 expireAfterAccess 的方法 CacheBuilder API
我们可以在想要使用 google gauva服务器时使用此功能。但在我的应用程序中,由于我的集中式缓存服务器要求,我必须使用redis服务器进行缓存。 我检查了RedisCacheManager类,但没有找到实现此方法的方法。 我如何在redis-cache-server中实现此功能。 下面是创建RedisCacheManager bean的代码:
@Bean
RedisCacheManager cacheManager() {
final RedisCacheManager redisCacheManager = new RedisCacheManager(
redisTemplate());
redisCacheManager.setUsePrefix(true);
redisCacheManager.setDefaultExpiration(redisExpireTime);
return redisCacheManager;
}
答案 0 :(得分:0)
我通过自定义cacheResolver解决了这个问题,但效果似乎很低。
public class MyCacheResolver extends SimpleCacheResolver {
@Autowired
private RedisTemplate<Object, Object> template;
public CustomCacheResolver(CacheManager cacheManager) {
super(cacheManager);
}
@Override
public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
if (context.getOperation() instanceof CacheableOperation) {
DefaultParameterNameDiscoverer discover = new DefaultParameterNameDiscoverer();
CacheableOperation op = (CacheableOperation) context.getOperation();
String[] ps = discover.getParameterNames(context.getMethod());
EvaluationContext ctx = new StandardEvaluationContext();
for (int i = 0; i < ps.length; i++) {
ctx.setVariable(ps[i], context.getArgs()[i]);
}
ExpressionParser parser = new SpelExpressionParser();
String redisKey = parser.parseExpression(op.getKey()).getValue(ctx, String.class);
String prefix = getCacheNames(context).iterator().next();
long time = template.getExpire(prefix + ":" + redisKey);
if (time > 0) {
template.expire(prefix + ":" + redisKey, 300L, TimeUnit.SECONDS);
}
}
return super.resolveCaches(context);
}
}
在我的情况下,每次缓存命中都会自动刷新缓存ttl到300秒。 然后将cacheResolver注入配置类
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Bean("customCacheResolver")
@Override
public CacheResolver cacheResolver() {
return new CustomCacheResolver(cacheManager());
}
@Bean
public RedisCacheManager cacheManager() {
//define your cacheManager here
}
}
我希望很清楚,英语不是我的母语。