我需要为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
时刻,我们不知道哪些查询过期(哪些密钥?)
答案 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()