大多数缓存服务都支持将任何对象缓存为键值对。但我正在寻找一种可以将对象缓存为区域或组的方法。这意味着,缓存对象应该能够分组。一个或多个对象被缓存到一个组中。无论我们对组做什么(删除、更新),都应该影响组中的对象。
我搜索了一些缓存服务,发现JCS支持这个。我应该实现一种通用的方法,因为它可以用于大多数缓存服务。有谁知道任何有帮助的方法或支持资源?
编辑: @ cruftex:假设小商店有一个库存系统。有文具、蔬菜、水果、糖果及其价格等详细信息需要缓存。如果我只需要清除或更新可食用的元素(蔬菜、水果、糖果),而不是文具和缓存的任何其他不可食用的对象集,该怎么办?如果有一种方法可以对“可食用”、“不可食用”进行分组,我可以对特定组进行任何更改,以便所有组成员实例都会受到影响。
最佳答案
目前我看不出您的使用场景是否证明特殊的缓存功能是合理的。
如果您通过 Cache.put() 在写入配置中更新产品,缓存会自动同步。
如果您使用持久层,例如JPA,其内部缓存也是同步的。
如果你自己负责控制缓存,你只需要知道哪些对象属于一个组并进行失效,例如:
Cache<Integer,Set<Integer>> groupId2productsId = .... Cache<Integer, Product> productId2product = .... void invalidateGroup(int id) { productId2product.removeAll(groupId2productsId.get(id)); }
当然,您可以将产品分区到多个缓存(或区域)。然后我会在普通缓存之上执行分区算法。但这是一种不灵活的方法,如果您有多个分区标准或者有重叠,那么您就会遇到麻烦。
一般说明:要按标准寻址一组对象,您需要一个索引结构,或迭代所有内容。通常这是数据库的工作。 EHCache 具有内置搜索功能,因此您可以查询缓存中的对象并使它们无效,但我怀疑 EHCache 是否具有快速/索引实现。我会考虑将这样的东西放入缓存中是否有意义,但它不会是基于“标准”的解决方案。
关于java - 缓存区域和缓存内存组 : Memcache, EhCache、JCS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22331871/