缓存大师的缓存问题。
上下文
我们已经使用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);
此机制具有简单的实现,但具有性能 缺点:它必须旋转每个条目以使组无效。 (虽然它仍然比旋转数据库更快)。
问题
感谢
将
答案 0 :(得分:2)
在尝试使用临时失效过程扩展遗留系统时,我也实现了匹配器方法。 O(n)性质不是问题,因为缓存很小,失效是在非面向用户的线程上执行的,并且它没有持有锁,因此没有争用惩罚。这对于跨越交叉缓存的密钥进行匹配是必需的,例如使遍布应用程序的缓存中的公司的所有数据无效。这实际上是一个没有设计中心的问题,所以应用程序是整体的,分解很差。
当我们根据域名服务重写它时,我采用了不同的策略。我们现在将特定数据的域集中到特定的缓存中,例如配置,因此它成为多查找的需求。在这种情况下,我们意识到密钥只是值的一个子集,因此我们可以在从元数据加载(例如注释)之后提取所有密钥。这允许通过我们的缓存抽象进行细粒度分组和方便的编程模型。我在关于这个想法的教程中发布了核心数据结构IndexMap。它不是为了在抽象之外直接使用,而是更好地解决了我们面临的分组问题。
http://code.google.com/p/concurrentlinkedhashmap/wiki/IndexableCache