首页 文章

如何使缓存数据(在redis上)基于上次访问到期?

提问于
浏览
0

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

我想计算从可缓存方法的上次访问到第一次访问的到期时间 . Google库已经给出了直接的方法来实现这个:在 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;
}

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
     }
    
    }
    

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

相关问题