使用正则表达式键在春季缓存逐出

时间:2015-11-04 12:04:37

标签: spring spring-cache

我正在使用弹簧缓存,我的缓存应该更新并删除特定密钥。

下面是我在缓存中插入值的代码

@Cacheable(value = CACHE_NAME, key = "")
    public InputStream getFiles(String fileName, String id) {
        clearCache(fileName, id);
        return restTemplate.getForObject(configurationFileUrl, InputStream.class, id);
    }

删除

@CacheEvict(value = CACHE_NAME, key = " ")
    public void clearCache(String fileName, String id) {

    }

这里我试图将密钥作为SpEL传递给正则表达式,这将删除以相同文件名开头但与最新更新密钥不同的密钥。例如,如果缓存低于条目 krishna1 - > OBJ1 现在obj在其他一些项目DB中被修改了,现在它正在保持记录 Krishna2参考修改后的Obj1

所以一旦打电话到我的服务,我需要检查缓存中的组合名称+密钥,如果不存在,我应该插入新条目(Krishna2),但现在我的旧条目Krishna1将永远不会被使用,所以如何删除它。

我无法使用文件名创建密钥,否则无法识别文件是否被修改。

问题陈述: 假设我有一个维护数据库访问的微服务,并在我的域名中部署为Service1。 DB包含3个java class class1 - >用于绘制rectancle,class2->绘制圆和class3 - >为三角形。现在想想你已经在某个地方部署了微服务,它正在获得绘制形状的请求。采取它获取请求绘制圆的场景,并得到配置说class2和V1(版本信息)负责绘制圆。因此它将对service1下载class2进行休息调用并编译并缓存它.class,以便下一个请求它可以直接服务,如果绘制圆逻辑(class2)没有变化。 class2的变化可能在将来发生但很少发生。现在遇到问题,一旦得到请求它将首先检查它是否已经具有相同版本的类如果是,则绘制圆圈否则它将进行休息调用以获取更新java文件并将编译并缓存它记忆。这就是我将附加版本(id)附加到键的原因,以便它可以区分文件是否已存在并更改。

1 个答案:

答案 0 :(得分:0)

是的,我和@Hanno Binder一起参加了这个活动;您可能遇到了设计问题,特别是您尝试使用密钥来区分版本时在Cache中对对象进行版本化的方式。

(免责声明)我在这里并不完全理解你的要求,但似乎你可以通过使用相同的密钥保持缓存中对象的最新(更新)版本来简化一些事情。为什么缓存对象的用户关心正在使用的版本,只要它们在可用时获得最新版本即可。

在这种情况下,确保最新版本是缓存的(并从@Cacheable方法返回)非常简单,而不必使用Spring @CachePut annotation求助于“特殊”驱逐标准。然后,您只需确保通过使用var styleSheets = document.styleSheets; var href = 'http://yoursite.com/foo/bar/baz.css'; for (var i = 0; i < styleSheets.length; i++) { if (styleSheets[i].href == href) { styleSheets[i].disabled = true; break; } } 注释的方法路由所有更新。随后,所有调用的@Cacheable方法都将获得最新的“版本”。

如果我错过了您的要求,我会道歉。