缓存大师的缓存问题。
上下文
我们已经使用OpenSymphony的OsCache几年了,并考虑转向更好/更强/更快/更主动开发的缓存产品。
问题
我们使用了OsCache的“组条目”功能,但没有在其他地方找到它。
简而言之,OsCache允许您在“输入插入时间”指定一个或多个组。稍后,您可以在不知道每个条目的键的情况下使“一组条目”失效。
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")替代方案:匹配机制
我们使用由前团队成员编写的另一个本地缓存,它使用“键匹配器”模式来使条目无效。
在这种方法中,您将定义'key‘和matcher’类如下:
public class AnimalKey
{
String fRegion;
String fPhylum;
String fFootType;
..getters and setters go here
}Matcher:
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);这种机制有一个简单的实现,但在性能上有一个缺点:它必须遍历每个条目才能使一个组失效。(虽然它仍然比在数据库中旋转更快)。
问题
谢谢
将要
发布于 2010-07-29 06:49:30
我也实现了一种匹配方法,当我试图扩展一个带有临时失效过程的遗留系统时。O(n)性质不是一个问题,因为缓存很小,失效是在一个面向非用户的线程上执行的,并且它没有保存锁,所以没有争用惩罚。这是为了与横切缓存的密钥进行匹配所必需的,例如使应用程序中缓存中的公司的所有数据失效。这确实是一个没有设计中心的问题,所以应用程序是单块的,分解得很差。
当我们基于域服务重写它时,我采取了不同的策略。我们现在已经将特定数据的域集中到特定的缓存中,例如配置,因此它成为了多查找的愿望。在这种情况下,我们意识到键只是值的一个子集,因此我们可以在加载后从元数据(例如注释)中提取所有的键。这允许通过缓存抽象进行细粒度分组和方便的编程模型。我在一个关于这个想法的教程中发布了核心数据结构IndexMap。它不是用于抽象之外的直接使用,而是更好地解决了我们面临的分组问题。
http://code.google.com/p/concurrentlinkedhashmap/wiki/IndexableCache
https://stackoverflow.com/questions/3358119
复制相似问题