0

假设我有两张桌子

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缓存结果并且每个用户的查询不能不同,因为这样缓存就不起作用了。我希望所有用户都从同一个缓存条目加载帖子。

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

我不知道如何处理这个问题,你们怎么看?

谢谢

4

1 回答 1

0

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

关于您提到的内容,似乎并不清楚;至少对我来说。

如果你想缓存一个用户的最爱,你总是需要一个不同的查询,因为你使用不同的数据,特别是 user_id。如果您想要制作,我们称之为多个缓存,每个用户一个,这将是可行的,但是,您遇到的问题是您必须检查用户的收藏列表中是否有新内容,除非您更新当用户选择新的东西作为收藏时的特定缓存。

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

更新
考虑到您的评论,当用户将某些内容添加到收藏夹列表时,我将重建缓存,从而减少用户的停机时间。

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

但是一旦你在会话中加载了收藏夹,性能应该没有问题,除非你有太多的用户,你在会话上存储了太多的信息,或者你一直有太多的数据流和查询。

于 2012-10-21T13:30:38.720 回答