分布式对象缓存框架和基于密钥的依赖关系

时间:2013-03-28 10:29:39

标签: caching distributed-caching

我一直在研究几个缓存框架。 即 Memcached / Couchbase,AppFabric,Redis,MongoDB

好的..其中一些实际上是缓存框架,其他的是“文档存储”。

现在问题出现了...... 我经常遇到我根本不知道所有缓存密钥(例如所有缓存产品)的情况,但是例如我想确保所有缓存的产品都被驱逐。使用Runtime.MemoryCache,我可以使用 基于密钥的依赖项,例如,我可以创建“产品”密钥,所有其他产品都使用此密钥作为依赖项 。现在每当我删除“产品”时,与此密钥相关的所有密钥也都被驱逐。

不幸的是,MongoDB,Couchbase和Redis没有这样的功能。 至少我找不到任何有关它的信息。 Redis具有KEYS(http://redis.io/commands/keys)命令,但文档告诉您不要在生产环境中使用它。

AppFabric能够处理依赖关系,但还有其他缺点。例如。如果你使用标签(用作依赖项),你也必须使用区域。如果您使用区域,则会失去高可用性。

无论如何......我的问题是:这是一个非常罕见的情况,需要这种依赖性,还是我对评估的数据库/缓存框架的缺点?

1 个答案:

答案 0 :(得分:3)

简单地回答你的问题:这是你要测试的缓存框架的短缺,而且想要那种依赖关系并不是一个不常见的场景。实际上,任何可行的缓存解决方案必须至少具有与关系数据存储或非关系数据存储同步的能力。

如您所述,基于密钥的依赖关系将一个缓存项与缓存中的另一个项相关联。当特定项目更改时,它会使依赖项无效。每当从缓存中删除或更新该项时,关联的对象将过期。基于密钥的依赖是级联的。例如,如果key1依赖于key2,则key2依赖于key3,而key3依赖于key4,那么删除key4将导致key1,key2和key3的到期。

除了基于密钥的依赖项之外,您还可以使用其他依赖项(如基于文件)(使您的缓存对象依赖于外部文件,如果文件已更新或删除,则会删除缓存中的依赖对象) ),数据库依赖关系(将缓存的项与数据库同步,因此数据库中的任何更改都会从缓存中删除相关的缓存对象),自定义依赖关系(您可以根据应用程序逻辑使对象失效)。

NCache就是这样一种产品,可根据您的应用需求提供一整套依赖功能。