Caching 如何使缓存数据(在redis上)在上次访问的基础上过期?

Caching 如何使缓存数据(在redis上)在上次访问的基础上过期?,caching,spring-boot,spring-cache,spring-data-redis,redis-cache,Caching,Spring Boot,Spring Cache,Spring Data Redis,Redis Cache,我有一个spring微服务应用程序,它使用redis服务器进行缓存存储。 使用RedisCacheManager Api。在这里,我们可以选择设置“setDefaultExpiration”。因为rediscachemanager从第一次访问带注释的方法(@cacheable)开始计算过期时间 我想从可缓存方法的最后一次访问计算到期时间,而不是从第一次访问计算到期时间。 谷歌图书馆已经给出了实现这一目标的直接方法: 在CacheBuilder中,我们有一个名为expireAfterAccess

我有一个spring微服务应用程序,它使用redis服务器进行缓存存储。 使用RedisCacheManager Api。在这里,我们可以选择设置“setDefaultExpiration”。因为rediscachemanager从第一次访问带注释的方法(@cacheable)开始计算过期时间

我想从可缓存方法的最后一次访问计算到期时间,而不是从第一次访问计算到期时间。 谷歌图书馆已经给出了实现这一目标的直接方法: 在CacheBuilder中,我们有一个名为expireAfterAccess

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

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


    return redisCacheManager;
}

我通过定制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);
}
}

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

这是Redis设置:@mp911de我想我们需要在spring框架中配置一些功能。因为对来自应用程序的缓存数据的逐出请求。Redis只支持无条件过期。这与访问后的过期无关。SpringDataRedis允许您定义写入后设置的到期日。(写入后到期)@mp911de是的,我知道redis只支持“写入后到期”。但我正在寻找SpringDataRedis中“访问后过期”的解决方案。谢谢你的调查。
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
    @Bean("customCacheResolver")
    @Override
    public CacheResolver cacheResolver() {
        return new CustomCacheResolver(cacheManager());
    }

 @Bean
 public RedisCacheManager cacheManager() {
     //define your cacheManager here
 }

}