使用regex键在spring中执行缓存逐出

使用regex键在spring中执行缓存逐出,spring,spring-cache,Spring,Spring Cache,我使用的是SpringCache,我的缓存应该针对特定的密钥进行更新和删除 下面是我在缓存中插入值的代码 @Cacheable(value = CACHE_NAME, key = "") public InputStream getFiles(String fileName, String id) { clearCache(fileName, id); return restTemplate.getForObject(configurationFileUr

我使用的是SpringCache,我的缓存应该针对特定的密钥进行更新和删除

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

@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传递,这将删除以相同文件名开头但与最新更新的密钥不同的密钥。e、 g如果缓存有以下条目 奎师那1->obj1 现在obj在其他一些项目DB中得到了修改,现在它正在维护记录 Krishna2,参考修改后的Obj1

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

我不能用文件名创建密钥,否则它将无法识别文件是否被修改

问题陈述:
假设我有一个维护DB访问的微服务,它部署在我的域名it Service1中。DB包含3个java类class1->用于绘制矩形,class2->用于绘制圆,class3->用于绘制三角形。现在,假设您已经在外部某处部署了微服务,它正在收到绘制形状的请求。假设它得到了绘制圆的请求,并且它得到了配置,说明class2和V1(版本信息)负责绘制圆。因此,它将对service1进行rest调用,下载class2并编译并缓存它。class,这样,如果画圈逻辑(class2)没有变化,它就可以直接处理下一个请求。类2中的更改可能在将来发生,但很少发生。现在问题来了,下一次收到请求后,它将首先检查是否已经有相同版本的类,如果是,则画圆圈,否则它将进行rest调用以获取更新java文件,并将编译并将其缓存在内存中。这就是我将版本(id)附加到键的原因,以便它可以区分文件是否已经存在并已更改

是的,这一次我和@Hanno Binder在一起;似乎您可能存在设计问题,特别是在尝试使用键来区分版本的方式中

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

在这种情况下,确保最新版本是缓存的版本(并从@Cacheable方法返回)非常简单,而无需使用“特殊”逐出标准。然后,您只需要确保所有更新都通过带有
@CachePut
注释的方法进行路由。随后,所有调用的@Cacheable方法都将获得最新的“版本”


再次,如果我没有注意到您的要求,我深表歉意。

您可能有设计问题。如果实体的键的值可能会更改,则该键不是一个好键,不用于缓存映射,也不用于大多数其他目的。-或者,从另一个角度来看,使用缓存存储实体,但不存储实体之间的关系。我已在问题中添加了问题陈述,请让我知道这是否清楚。若你们发现设计中的缺陷,也很想知道你们的想法。多谢各位@HannoBinderI理解这一需求,就像有人在不通知缓存的情况下更改缓存对象(即class2)的源一样,这可能会导致过时的读取&c。解决方案应该是在源更改时清除任何缓存对象。因此,无论谁更改class2,或者更改用于什么的类的映射,都必须确保删除/失效/。。。相应的缓存项。然后,您可能不再需要缓存中的版本号:您只为每个密钥缓存了0或1个对象,并且您拥有的对象与源的最新版本同步。