我一直在网上阅读关于memcache的内容。我找到了很多例子,讨论了使用memcache设置和检索数据的流程,例如。
REQUEST data key from memcache
IF key not found
THEN get data from DB and store result in memcache
ELSE get data from memcache
这非常好,直截了当,易于理解。我想要解决的是在对数据集进行更改后更新已定义密钥的最佳方法。
例如,如果我缓存以下查询:
SELECT * FROM user_info WHERE user = 26;
我可能会对SQL进行散列并将其用作密钥并将数据粘贴在其中。但是,如果我现在为用户26更新user_info
表,更新缓存数据的最佳方法是什么,我将无法在不返回查询的情况下知道散列的SQL字符串。
我确实读过您在数据更改后再次运行SELECT查询但如果您有大量查询引用同一个表,这似乎有点尴尬。
无论如何,我想听听工作流建议。
答案 0 :(得分:0)
计算机科学中只有两件事:缓存失效和命名事物。
- Phil Karlton
知道何时清除缓存非常困难。有很多方法,但我不确定是否有一个银弹解决方案。
根据您的具体用例,需要考虑一些方法:
1 - 基于密钥的缓存 - 在数据更改时更改缓存密钥 - 通常包括密钥中的时间戳: http://37signals.com/svn/posts/3113-how-key-based-cache-expiration-works
2 - 使用以编程方式易于过期的密钥。例如在上面的情况下,密钥可以是
user_info_26
然后在任何
的方法中将任何更新包装到user_infoUpdate info for user 26
clear cache for key user_info_26
然后将其视为代码中的原子操作。
3 - 有某种缓存清除程序异步作业。例如定期检查用户26的上次更新时间戳,如果与缓存数据不匹配,则清除缓存。
我确信还有很多其他策略,但正确的策略取决于应用程序的确切性质。