缓存区域和缓存内存组:Memcache, EhCache, JCS



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

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

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

目前我看不出您的使用场景需要一个特殊的缓存特性。

  1. 如果你通过cache .put()在write through配置中更新你的产品,缓存会自动同步。

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

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

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

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

最新更新