用户收藏夹和Memcached

时间:2012-10-21 13:17:11

标签: php mysql memcached

假设我有两张桌子

posts
 - post_id
 - image

favorites
 - fav_id
 - post_id
 - user_id

当用户进入该站点时,将从数据库中提取10个帖子并显示。我现在正在做的是将这些表连接在一起并循环结果,在那里我可以检查用户是否有所收藏。

这样的事情:

SELECT p.*, f.fav_id
FROM posts p
LEFT JOIN favorites f
ON p.post_id = f.post_id AND user_id = $user_id
LIMIT 10 

这很好,但现在我想用 memcached 缓存结果,并且每个用户的查询不能有所不同,因为缓存不起作用。我希望所有用户都从同一个缓存条目加载帖子。

我的第一个想法是,我可以在登录时获取所有用户的收藏夹并将其保存到缓存中并在浏览网站上的帖子时使用它。我的朋友建议,当用户有很多收藏夹并且许多用户同时登录时,这可能会变得很重。

我不知道如何处理这个,你们觉得怎么样?

谢谢

1 个答案:

答案 0 :(得分:0)

查询本身并不是特别密集,因此对于服务器上的负载应该没问题。

关于你提到的内容,似乎并不清楚;至少对我而言。

如果要创建有关用户收藏夹的缓存,则需要始终使用不同的查询,因为您使用的是不同的数据,特别是user_id。如果你想要的是,让我们称之为,许多缓存,每个用户一个,这是可行的,但是,你有问题,你必须检查用户是否在收藏夹列表中有新的东西,除非你更新当用户选择新的收藏时,该特定缓存。

我会使用查询在会话开始时检查每个用户的收藏夹,并将它们保留在那里直到会话结束,如果用户添加了新内容,那么我将更新该列表会话。

UPDATE
考虑到你的评论,我会在用户向收藏列表添加内容时重建缓存,减少用户停机时间。

此外,您可以使用简单查询在用户登录时获取这些结果。一个简单的查询将快速运行并很快提供结果。

但是一旦你在会话中加载了收藏夹,就性能而言应该没问题,除非你有太多的用户,你的商店关于会话的信息太多,或者你的数据和查询总是有太多的流量