我有一个分类广告网站ala craigslist.org - 只是规模小得多。
我正在运行MongoDB,并在Redis中缓存所有API请求,其中Mongo查询是关键,值是MongoDB结果文档。
伪代码:
// The mongo query
var query = {section: 'home', category: 'garden', 'region': 'APAC', country: 'au', city: 'sydney', limit: 100}
// Getting the mongo result..
// Storing in Redis
redisClient.set(JSON.stringify(query), result);
现在,用户在同一类别中创建了一个新帖子,但Redis现在提供了一个陈旧的记录,因为Redis不知道数据集已经改变。
我们如何克服这个?
我可以在一般情况下或在特定密钥上设置到期日,但实际上,当用户为那些结果集包含新创建记录的密钥创建新帖子时,mem缓存密钥需要到期。
一种方法是迭代所有Redis密钥并提出一种模式,以根据新创建的记录的特征来检测应删除哪些密钥。只有这种方法看起来太聪明了#34;而且不太正确。
因此我们希望在即时提供新内容的同时记忆缓存。
答案 0 :(得分:3)
我会避免将批量查询结果缓存为单个密钥。 Redis适用于需要以非常高的频率访问和更新数据的用例,以及使用数据结构(如散列,集合,列表,字符串或有序集合[1])的情况。另外,请记住,MongoDB已经将部分数据库缓存在内存中,因此您可能看不到性能提升的方式。
更好的方法是单独缓存每个帖子。您可以add keys to sets将它们分组到类别甚至只是页面(例如用户希望在每个页面上看到的20个左右的帖子)。这样,每次用户发布新帖子或更新现有帖子时,您都可以更新Redis缓存中的相应密钥。