我正在使用弹簧缓存,我的缓存应该更新并删除特定密钥。
下面是我在缓存中插入值的代码
@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)附加到键的原因,以便它可以区分文件是否已存在并更改。
答案 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方法都将获得最新的“版本”。
如果我错过了您的要求,我会道歉。