1

假设我为相似的数据缓存了稍微不同的信息集,例如,用户的最后 10 个帖子标题、他的最后 100 个和他的最后 200 个。

我有这样的事情:

cache.set('posts' + user_id + num_posts, DATA, 30)

因此,假设用户 ID 为 123,我最终会缓存posts12310(10 个帖子)、posts12320(20 个帖子)等

我从查询字符串中得到 num_posts。

当用户添加新帖子时,我想使所有与他相关的缓存查询无效,例如所有以 .开头的 posts123缓存。怎么做?

另外,请注意,这是对涉及大数据而不是博客文章标题的实际问题的简化,但问题的核心是相同的:如何对缓存项进行分组,以便可以使整个组无效。另外,我没有使用装饰器,但我需要使用较低级别的 API。

谢谢

4

1 回答 1

2

不要在缓存中存储许多相同数据的子集。使用您需要的最大帖子数(即 200)存储一个值,然后从缓存中检索数据后执行列表切片以获得所需的结果数:

DATA = [<200 last posts here>]
cache.set('posts' + user_id, DATA, 30)  # Store everything

这样,您将只有一个键,因此很容易使缓存无效,并且您将在缓存中存储更少的数据。

# Get all cached posts and slice 10 first items 
cache.get('posts' + user_id)[0:10]

# Get all cached posts and slice 100 first items 
cache.get('posts' + user_id)[0:100]

请记住,当缓存中的请求值少于请求值时,您将不得不处理这种情况)

于 2013-05-27T10:38:01.790 回答