缓存模式:你怎么称呼(以及如何替换)OpenSymphony OsCache“组”范例

时间:2010-07-28 22:39:15

标签: caching ehcache oscache

缓存大师的缓存问题。

上下文

我们已经使用OpenSymphony的OsCache多年,并考虑转向更好/更强/更快/积极开发的缓存产品。

问题

我们使用过OsCache的“群组条目”功能,但在其他地方找不到它。

简而言之,OsCache允许您在'entry中指定一个或多个组 插入时间'。稍后,您可以在不知道每个条目的密钥的情况下使“条目组”无效。

OsCache示例

以下是使用此机制的示例代码:

Object[] groups = {"mammal", "Northern Hemisphere", "cloven-feet"}
myCache.put(myKey, myValue , groups );
// later you can flush all 'mammal' entries 
myCache.flushGroup("mammal")
// or flush all 'cloven-foot'
myCache.flushGroup("cloven-foot")

替代方案:匹配机制

我们使用由前团队成员编写的另一个本土缓存,该团队成员使用“密钥匹配器”模式使条目无效

在这种方法中,您可以按如下方式定义“密钥”和匹配器类:

public class AnimalKey 
{
   String fRegion;
   String fPhylum;
   String fFootType;

   ..getters and setters go here

}

匹配器:

public class RegionMatcher implements ICacheKeyMatcher
{
   String fRegion;

   public RegionMatcher(String pRegion)
   {
    fRegion=pRegion;
   }

   public boolean isMatch(Obect pKey)
   {
      boolean bMatch=false;
      if (pKey instanceof AnimalKey)
      {
         AnimalKey key = (AninmalKey) pKey);
         bMatch=(fRegion.equals(key.getRegion());
      }
   }
}

用法:

myCache.put(new AnimalKey("North America","mammal", "chews-the-cud");
//remove all entries for 'north america'
IKeyMatcher myMatcher= new AnimalKeyMatcher("North America");
myCache.removeMatching(myMatcher);

此机制具有简单的实现,但具有性能 缺点:它必须旋转每个条目以使组无效。 (虽然它仍然比旋转数据库更快)。

问题

  • 警告:这可能听起来很愚蠢)你调用什么这个功能? OsCache将其称为“缓存组”。 JbossCache和EhCache似乎都没有定义或实现它。领域?区域?王国?
  • 这个“缓存组/区域”范例是否存在标准模式?
  • 上升星级缓存产品(例如ehcache,coherence,jbosscache)如何处理此问题
  • 这个范例不在jcache规范中,对吧? (JSR-107)
  • 你如何处理“大规模无效”?缓存非常棒,直到它们变得陈旧。允许您使宽幅区域无效的API是一个很大的帮助。 (例如,管理员想要按下按钮并清除所有缓存的帖子条目,例如,某个特定论坛)

感谢

1 个答案:

答案 0 :(得分:2)

在尝试使用临时失效过程扩展遗留系统时,我也实现了匹配器方法。 O(n)性质不是问题,因为缓存很小,失效是在非面向用户的线程上执行的,并且它没有持有锁,因此没有争用惩罚。这对于跨越交叉缓存的密钥进行匹配是必需的,例如使遍布应用程序的缓存中的公司的所有数据无效。这实际上是一个没有设计中心的问题,所以应用程序是整体的,分解很差。

当我们根据域名服务重写它时,我采用了不同的策略。我们现在将特定数据的域集中到特定的缓存中,例如配置,因此它成为多查找的需求。在这种情况下,我们意识到密钥只是值的一个子集,因此我们可以在从元数据加载(例如注释)之后提取所有密钥。这允许通过我们的缓存抽象进行细粒度分组和方便的编程模型。我在关于这个想法的教程中发布了核心数据结构IndexMap。它不是为了在抽象之外直接使用,而是更好地解决了我们面临的分组问题。

http://code.google.com/p/concurrentlinkedhashmap/wiki/IndexableCache