查询缓存的实现

时间:2010-01-14 18:47:48

标签: caching memcached

我需要为SQL查询实现缓存。 假设我们有SELECT id,aa,bb FROM table1 WHERE aa>1 and bb=12; - 我们希望它被缓存。 此外,它当然可以是SELECT id,aa,bb FROM table1 WHERE aa>25 and bb=11;SELECT id,aa,bb FROM table2;

没什么大不了的 - 真正的问题是如何更好地使缓存值过期。在更新。比如说,我们添加了INSERT ...的新行或使用UPDATE ...更新了现有数据。 我们需要使所有具有SELECT s值的缓存失效,因为它们可能不再准确。

如何做得更好?

在最简单的情况下 - 我们在缓存中使用整个“SQL查询”请求密钥。但是在INSERT / UPDATE时刻,我们不知道哪些查询过期(哪些密钥?)

2 个答案:

答案 0 :(得分:0)

我之前做过的一件事就是制作缓存密钥列表并将其存储在缓存中。

当我需要缓存某些内容时,我会抓住该列表,将密钥添加到其中,然后将其存储回缓存中。然后当我需要清除特定集的缓存时,我抓住列表并从缓存中删除列表中的每个键,并从缓存中删除列表。

我得到的印象是,NHibernate中的某些缓存库也是如此,但我并不完全确定。

答案 1 :(得分:0)

这就是为什么一般建议尝试将memcached用作查询缓存。

你有一种模型,它由数据库在低端表示,而在高端由API表示。您应该在该API附近缓存。

例如,不要将SELECT id,aa,bb FROM table1 WHERE aa>1 and bb=12;视为一项操作,而是将操作更多地考虑如下:

bbObject = BBObject.get(12); # reusable and independently cached BB instance.
bbObject.getAAs()            # Another reusable and independently cacheable obj

有了这个,你就有了可以使用的结构,如何使用它会更加明显。

例如,此处table1表示的任何内容(将其称为aa,因为我可以从您的示例中推断出来。)

# save a new aa in `table1` and invalidate the `bbObject.getAAs` cache(s)
aa AA.new(bbObject, 5).save()