【问题标题】:Why Redis Cache is not getting empty in my Spring Boot application?为什么我的 Spring Boot 应用程序中的 Redis 缓存没有变空?
【发布时间】:2020-09-24 12:12:35
【问题描述】:

我在我的 Spring Boot 应用程序中使用 Redis Cache 来存储多个 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缓存的代码?

【问题讨论】:

  • 你有@EnableCaching注解吗?启用弹簧缓存。

标签: java spring spring-boot redis


【解决方案1】:

Spring 使用 Spring AOP (Aspect Oriented Programming) 来实现缓存,这意味着您必须在 cacheEvict() 方法上使用 public 访问级别,以便它可以被 AOP 代理拦截。否则就好像你从来没有用@CacheEvict注释你的方法

【讨论】:

    【解决方案2】:

    检查以下内容:

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

    问候。

    【讨论】:

    • 我在我的主类 Application.java 类上使用了 @EnabledCaching 注释。我将按照您的步骤 3 删除 CacheEvict Annotation。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2021-04-21
      • 1970-01-01
      • 2023-02-10
      • 2021-07-04
      • 1970-01-01
      • 2020-04-23
      • 2020-11-19
      • 1970-01-01
      • 2016-11-23
      相关资源
      最近更新 更多