首页 文章

绕过 生产环境 中的@Cacheable注释进行调试

提问于
浏览
0

我正在研究一个新的基于Spring的项目,我想知道,如果我要使用Spring 3.1或ehcache-spring-annotation项目中的@Cacheable注释,你将如何实现绕过缓存机制的机制"on demand",例如,用于 生产环境 调试 .

假设我的应用程序仅提供REST请求,有时候,我想,一次调用(我手动制作)直接从"DB"(或者有后端)获取数据并避免和任何缓存(任何缓存) . 当调用正在运行时,我真的不介意它是否重新填充缓存与它刚从db获得的内容...

我想听听你对如何实现这一点的想法 .

提前感谢任何指导,

肯 .

3 回答

  • 0

    除了现有的检查之外,您可以扩展缓存管理器并提供布尔表达式 .

    您可以在控制器的 ThreadLocal 中设置该布尔值,这样无论何时调用服务,布尔值都会到位 .

  • 0

    您可以创建一个方法来刷新缓存,并在需要数据库中的值时仅使用调试器运行它 .

    @Cacheable(modelId = "i18NTextCacheModel")
    public List<I18NText> loadAll() {
    
        logger.debug("loadAll called");
        ...
    }
    
    @CacheFlush(modelId = "i18NTextFlushModel")
    public Long save(I18NText entity) {
    
        logger.debug("save called");
        ...
    }
    
  • 0

    到达@Bozho建议的类似结果如果传递了请求参数 refresh-cache=true ,则会绕过缓存

    我扩展了DefaultRedisCacheWriter并将其用作CacheWriter

    RedisCacheManager cacheManager = RedisCacheManager
                .builder(new RefreshableRedisCacheWriter(redisConnectionFactory()))
                .cacheDefaults(cacheConfiguration)
                .build();
    

    覆盖此writer中的get()方法

    @Override
    public byte[] get(String name, byte[] key) {
    
        Assert.notNull(name, "Name must not be null!");
        Assert.notNull(key, "Key must not be null!");
    
        HttpServletRequest request = ApiRequestContext.getRequestContext();
        if (Boolean.valueOf(request.getParameter("refresh-cache"))) {
            logger.info("bypassing cache for key: {}", key);
            return null;
        }
    
        return execute(name, connection -> connection.get(key));
    }
    

    ApiRequestContext是一个自定义请求对象,存储在本地线程中 . 请注意,当此方法返回null时,将从db中获取值并将其放回缓存中,从而有效地刷新缓存 .

相关问题