1

大多数缓存服务支持将任何对象缓存为键值对。但我正在寻找一种可以将对象缓存为区域或组的方法。这意味着,缓存对象应该能够分组。一个或多个对象被缓存到一个组。我们对组所做的任何事情(删除、更新)都应该影响到组中的对象。

我搜索了一些缓存服务,发现 JCS 支持这个。我应该实现一种通用方式,因为它可以用于大多数缓存服务。有谁知道任何可以提供帮助的方式或支持资源?

编辑: @ cruftex:假设小商店有一个库存系统。需要缓存文具、蔬菜、水果、糖果及其价格等详细信息。如果我只需要清除或更新可食用的物品(蔬菜、水果、糖果),而不需要清除文具和任何其他不可食用的缓存对象集,该怎么办?如果有像“可食用”、“不可食用”这样的分组方式,我可以对特定组进行任何更改或更改,以便所有组成员实例都会受到影响。

4

1 回答 1

2

目前我看不出您的使用场景证明了特殊的缓存功能是合理的。

  1. 如果您通过 Cache.put() 在写入配置中更新您的产品,缓存会自动同步。

  2. 如果你使用持久层,例如 JPA,它的内部缓存也是同步的。

  3. 如果你自己负责控制缓存,你只需要知道哪些对象属于一个组并进行失效,例如:

    Cache<Integer,Set<Integer>> groupId2productsId = ....
    Cache<Integer, Product> productId2product = ....
    
    void invalidateGroup(int id) {
      productId2product.removeAll(groupId2productsId.get(id));
    }
    
  4. 当然,您可以将您的产品划分为多个缓存(或区域)。然后我会在普通缓存之上做一个分区算法。但这是一种不灵活的方法,如果您有多个分区标准或者您有重叠,那么您就有麻烦了。

一般说明:要按标准寻址一组对象,您需要一个索引结构,或者遍历所有内容。通常这是数据库的工作。EHCache 内置了搜索功能,因此您可以查询缓存中的对象并使它们无效,但我怀疑 EHCache 是否具有快速/索引实现。我会考虑将这样的东西放在缓存中是否有意义,但它不会是基于“标准”的解决方案。

于 2014-03-12T17:51:41.007 回答