4

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

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

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

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

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

无论如何......我的问题是:这是需要这些依赖项的非常罕见的场景,还是我评估的那些数据库/缓存框架的缺点?

4

1 回答 1

3

简单地回答您的问题:这是您要测试的缓存框架的缺点,而且需要这种依赖关系并不少见。事实上,任何可行的缓存解决方案都必须至少具有与关系或非关系数据存储同步的能力。

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

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

NCache就是这样一款产品,它可以根据您的应用程序需求提供一整套依赖项功能。

于 2013-05-15T10:51:23.817 回答