繁体   English   中英

为什么 Redis 缓存在我的 Spring 启动应用程序中没有变空?

[英]Why Redis Cache is not getting empty in my Spring Boot application?

我在我的 Spring 引导应用程序中使用 Redis 缓存来存储多个 rest API 的数据。

我正在使用 Spring Cron 作业定期清除 Redis 缓存。 该方法在所需的时间段被调用。

我已经验证了日志,但缓存并没有变得清晰,因此它显示的是陈旧的数据。

我试图清除缓存的代码。

public class CustomerDerivation {
    @Autowired
    @Qualifier("redisCacheMngr")
    CacheManager redisCacheMngr;

    @Scheduled(cron = "${redis.api.update.interval}")
    @CacheEvict(value = "redis-cache", allEntries = true, cacheNames = {"redis-cache"})
    protected void cacheEvict() {
        redisCacheMngr.getCache("redis-cache").clear();
        logger.info("Evicting ModelCache");
    }
}

自定义缓存配置代码。

@Configuration
@Profile("cloud")
public class CacheConfig extends AbstractCloudConfig {
    @Autowired
    Environment env;

    @Bean
    public RedisConnectionFactory brRedisFactory() {
        return connectionFactory().redisConnectionFactory(env.getProperty("model_cache_name"));
    }

    @Bean
    public RedisTemplate<String, Object> brRedisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(brRedisFactory());
        return redisTemplate;
    }

    @Bean(name = "redisCacheMngr")
    public CacheManager cacheManager() {
        RedisCacheManager cacheManager = new RedisCacheManager(brRedisTemplate());
        cacheManager.setUsePrefix(true);
        cacheManager.setTransactionAware(true);
        return cacheManager;
    }
}

如何修复清除 redis 缓存的代码?

1)您是否使用@EnableCaching 注释启用了缓存? 2) 为什么在同一个方法中使用@CacheEvict 和clear()? 两者服务于相同的目的。 使用其中之一。

检查以下内容:

  1. 应用程序以相应的配置文件(即“云”)启动
  2. @EnabledCaching 在您的配置上
  3. 避免混合 @CacheEvict 和 CacheManager bean,你必须选择一种方式进行驱逐
  4. 提取另一个“CronJobs”bean 中的@Scheduled 方法,以避免多个注释和 AOP inside class 问题。

问候。

我在我的 Spring 引导应用程序中使用 Redis 缓存来存储多个 rest API 的数据。

我正在使用 Spring Cron Jobs 定期清除 Redis 缓存。 该方法在所需的时间段被调用。

我已经验证了日志,但缓存没有变得清晰,因此它显示的是过时的数据。

我试图清除缓存的代码。

public class CustomerDerivation {
    @Autowired
    @Qualifier("redisCacheMngr")
    CacheManager redisCacheMngr;

    @Scheduled(cron = "${redis.api.update.interval}")
    @CacheEvict(value = "redis-cache", allEntries = true, cacheNames = {"redis-cache"})
    protected void cacheEvict() {
        redisCacheMngr.getCache("redis-cache").clear();
        logger.info("Evicting ModelCache");
    }
}

自定义缓存配置代码。

@Configuration
@Profile("cloud")
public class CacheConfig extends AbstractCloudConfig {
    @Autowired
    Environment env;

    @Bean
    public RedisConnectionFactory brRedisFactory() {
        return connectionFactory().redisConnectionFactory(env.getProperty("model_cache_name"));
    }

    @Bean
    public RedisTemplate<String, Object> brRedisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(brRedisFactory());
        return redisTemplate;
    }

    @Bean(name = "redisCacheMngr")
    public CacheManager cacheManager() {
        RedisCacheManager cacheManager = new RedisCacheManager(brRedisTemplate());
        cacheManager.setUsePrefix(true);
        cacheManager.setTransactionAware(true);
        return cacheManager;
    }
}

如何修复代码以清除 redis 缓存?

Spring 使用 Spring AOP(面向切面编程)实现缓存,这意味着您必须在cacheEvict()方法上使用public访问级别,以便它可以被 AOP 代理拦截。 否则就像你从不使用@CacheEvict注释你的方法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM