我想知道你们如何管理缓存失效。考虑到缓存中可能会有数百或数千个对象,这些对象可能会被不同的算法或规则触发。你们是如何跟踪这些对象的呢?
是否可以从数据库表中引用关系,并以某种方式强制执行?
请原谅我之前没有做过任何缓存相关的工作。
我想知道你们如何管理缓存失效。考虑到缓存中可能会有数百或数千个对象,这些对象可能会被不同的算法或规则触发。你们是如何跟踪这些对象的呢?
是否可以从数据库表中引用关系,并以某种方式强制执行?
请原谅我之前没有做过任何缓存相关的工作。
正如你所发现的那样,这不像简单地更新新闻故事缓存那么简单。还有其他关系,例如需要更新的最新新闻列表。
最简单的方法是将所有相关对象联系起来。我以前使用过“缓存组”的概念。继续以新闻为例,在“缓存组”'news'中将包括:新闻故事、各种新闻故事列表及包含新闻故事的任何其他内容。
当我编辑新闻故事时,系统会识别出它需要更新'news'缓存组,并执行以下过程...
当然,这只是一个非常简单的例子。更好的做法是编写代码始终将对象保持在缓存中的状态。
如果您添加了新闻文章的标签,您的代码可以只将这些更改写入数据库,但如果您更新新闻文章对象和相关标签对象,则这两个对象都可以“知道”它们已更改(只需设置hasChanged = true
),然后您就可以自动更新缓存并保存到数据库中。
如果你正在使用SQL Server 2005或更高版本以及.NET,你可能需要考虑使用SQLDependency类。这个类使用SQL Server Service Broker来通知你数据发生了某些修改。你可以将其用作触发器来使缓存失效。需要注意的是,这仅适用于使用这些技术的情况。
对于一般解决方案,你可以看一下Juha提供的链接。
但根据你的问题,我想描述一下我们项目中是如何处理的。
我们没有使用任何通用的缓存解决方案。我们的缓存是逐渐增长起来的。最初我们并没有打算使用缓存。但后来缓存就出现了。由于缓存是最近添加到系统中的,它并不知道任何“数据库”或其他“智能东西”。相反,我们会仔细检查是否有人更改了缓存。因此,我将我们的缓存称为“算法驱动的”。
(唯一真正必要的通用功能是处理缓存失效的功能。
另一个值得注意的问题是与客户端的身份识别:如果你有多个客户端,一个缓存可能不够...但对于这两个问题,只是添加了特定的解决方案,并非通用解决方案!)
我知道,描述这样一个基本的功能可能听起来很傻。有人可能会说“我们一开始就应该使用正常的缓存”。但你知道,在现实生活中,有时候有些事情是你无法控制的,你只能尽力而为。
所以总结一下:我们不需要通用解决方案。我们的算法控制着缓存。这使得缓存保持较小的体积(在代码和运行时内存中)。这就是我们的方法。
在我看来,持久层是最好的地方来处理这个问题,因为它知道持久和可能被缓存的实体发生了什么。例如,Hibernate支持(二级)缓存,并允许定义二级缓存区域的名称,每个实体的缓存策略(只读、读写、非严格读写、事务性)。Hibernate实际上定义了一个接口,并允许根据您的需求插入缓存实现(缓存类型、支持的策略、集群支持)。
请原谅我,因为我以前从未做过任何缓存。
根据您的需求复杂程度,这可能不是一项简单的任务。也许您应该使用或查看现有的解决方案。在Java世界中,EHCache, OSCache, SwarmCache, JBoss Cache 2 都是失效缓存(或支持它)。这只是一个建议,因为您没有提到任何语言。