0

我有使用 redis-server 进行缓存存储的 spring 微服务应用程序。使用 RedisCacheManager API。在此我们可以选择设置“ setDefaultExpiration ”。因为 rediscachemanager 从第一次访问带注释的方法(@cacheable)计算到期。

我想从可缓存方法的最后一次访问而不是从第一次访问计算到期时间。谷歌库提供了直接的方法来实现这一点:在CacheBuilder我们有一个名为expireAfterAccess CacheBuilder API的方法

当我们想使用google gauva server时,我们可以使用它。但是在我的应用程序中,由于我的集中式缓存服务器要求,我必须使用 redis 服务器进行缓存。我检查了 RedisCacheManager 类,但没有找到实现这一目标的方法。我如何在 redis-cache-server 中实现此功能。下面的代码用于创建 RedisCacheManager bean:

@Bean
RedisCacheManager cacheManager() {
    final RedisCacheManager redisCacheManager = new RedisCacheManager(
            redisTemplate());
    redisCacheManager.setUsePrefix(true);
    redisCacheManager.setDefaultExpiration(redisExpireTime);


    return redisCacheManager;
}
4

1 回答 1

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
 }

}

我希望很清楚,英语不是我的母语。

于 2018-06-19T07:51:45.647 回答