首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >缓存模式:您称之为(以及如何替换) OpenSymphony OsCache "group“范式

缓存模式:您称之为(以及如何替换) OpenSymphony OsCache "group“范式
EN

Stack Overflow用户
提问于 2010-07-28 22:39:15
回答 1查看 1.1K关注 0票数 3

缓存大师的缓存问题。

上下文

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

问题

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

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

OsCache示例

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

代码语言:javascript
复制
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")

替代方案:匹配机制

我们使用由前团队成员编写的另一个本地缓存,它使用“键匹配器”模式来使条目无效。

在这种方法中,您将定义'key‘和matcher’类如下:

代码语言:javascript
复制
public class AnimalKey 
{
   String fRegion;
   String fPhylum;
   String fFootType;

   ..getters and setters go here

}

Matcher:

代码语言:javascript
复制
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());
      }
   }
}

用法:

代码语言:javascript
复制
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似乎都没有定义或实现它。王国?区域?对于这个“缓存组/区域”paradigm?
  • How do新兴星缓存产品(例如ehcache、一致性、jbosscache),存在着王国?
  • do标准模式来处理这个问题--
  • --这个范式不在jcache规范中,对吗?(JSR-107)
  • How你处理“大规模失效”吗?除非它们变老,否则缓存是很棒的。一个允许您使大范围的部分失效的API是一个很大的帮助。(例如,管理员希望按一个按钮,清除特定论坛的所有缓存的帖子条目)

谢谢

将要

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-29 06:49:30

我也实现了一种匹配方法,当我试图扩展一个带有临时失效过程的遗留系统时。O(n)性质不是一个问题,因为缓存很小,失效是在一个面向非用户的线程上执行的,并且它没有保存锁,所以没有争用惩罚。这是为了与横切缓存的密钥进行匹配所必需的,例如使应用程序中缓存中的公司的所有数据失效。这确实是一个没有设计中心的问题,所以应用程序是单块的,分解得很差。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3358119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档