【问题标题】:cache eviction in spring using regex key使用正则表达式键在春季缓存驱逐
【发布时间】:2015-11-04 12:04:36
【问题描述】:

我正在使用 spring 缓存,我的缓存应该针对特定键更新和删除。

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

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

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

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

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

【问题讨论】:

  • 您可能遇到了设计问题。如果实体的键值可能发生变化,则它不是一个好的键,不适用于缓存映射,也不适用于大多数其他用途。 - 或者,从另一个角度来看,使用缓存来存储实体,而不是存储实体之间的关系
  • 我在我的问题中添加了问题陈述,让我知道是否清楚。如果您发现设计中的缺陷,也有兴趣了解您的想法。谢谢你。 @HannoBinder
  • 我理解这样的要求,比如有人会在不通知缓存的情况下更改缓存对象(即 class2)的源,这可能会导致读取过时 &c。解决方案应该是在源更改时清除所有缓存的对象。因此,无论谁更改了 class2,或者哪个类的映射用于什么,都必须确保删除/无效/...相应的缓存条目。那么您可能不需要版本号。在缓存中:您只为每个键缓存了 0 或 1 个对象,并且您拥有的对象与最新版本的源同步。

标签: spring spring-cache


【解决方案1】:

是的,我和@Hanno Binder 在这个;看来您可能有设计问题,特别是您尝试使用区分版本的键对缓存中的对象进行版本控制的方式。

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

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

再次,如果我错过了您的要求,我深表歉意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多