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

时间:2014-03-11 17:15:13

标签: java caching memcached ehcache jcs

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

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

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

1 个答案:

答案 0 :(得分: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. 当然,您可以将产品划分为多个缓存(或区域)。然后我会在普通缓存之上做一个分区算法。但这是一种不灵活的方法,如果你有多个分区标准或者你有重叠,那么你就麻烦了。

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