我正在尝试建立类似Twitter的跟随机制。用户采取行动。我们列出了所有用户的关注者,然后用一些信息填充他们的所有流。由于这可能需要一些时间(如果你有10,000个关注者插入信息的10,000个关注者,也许是10,000个SQL调用),我想确保这是在后台完成的,而采取行动的用户可以去与他的生活。
所以,我正在考虑的策略是:
思考?我也玩过使用队列,比如SQS,但这种方法听起来可能也有用吗?此外,它(对我而言)的优点是更容易在本地测试,更容易在非ec2主机上运行。
如果这是一个很好的方法,我将如何在php脚本中打开php脚本?它可以像(如果php脚本存在于URL中)那样简单地在该脚本所在的URL上进行操作吗?
答案 0 :(得分:3)
这种描述的方式听起来像是要为跟随该用户的每个人复制/复制第一个用户的帖子?这将成为数据存储的噩梦。
你应该从另一个角度来看待它。考虑以下模型:
用户A发布了他早餐吃的东西。这会在用户ID的表格中存储一次。
用户B查看他的“流”。这是一个动态创建的帖子列表。此时,用户B关注50人。用户B的脚本将获得他最近关注的50个帖子,并在他的“流”中为他显示
使用此模型,每个轻薄的早餐更新,每个用户永远不会有多个帖子。此外,关注者的数量不会扩大发布twit所需的处理时间。我是指推特。
<强>澄清强>
你只需要进行一些规范化。因此,您将拥有一个users表,一个users_following表和一个posts表。该查询看起来类似于:
SELECT posts.* FROM users_following
LEFT JOIN posts ON posts.user_id = users_following.followed
WHERE users_following.follower = $idOfUserB
ORDER BY posts.created LIMIT 50;
答案 1 :(得分:0)
如果您希望自己的网站可以扩展。
(如果你有10,000名追随者 10,000个流来插入信息 在,即。也许10,000个SQL调用)
10,000次SQL调用失败了鲸鱼。我不会使用MySQL(或至少使用它与memcached)这样的应用程序,但使用redis。将活动数据集保留在内存中。保持数据模型尽可能简单。
如果这是一个好方法,那怎么样 我会从内部打开一个PHP脚本吗? 一个PHP脚本?
不要那样做。通过lpush向redis的blocking list添加消息,并通过blpop(守护进程)读取它们。我首先会填充在线用户列表,然后填充离线用户列表。离线用户不介意延迟,因为他们不在线。您可以在该人员的所有用户列表中引用密钥,并通过mget获取所有密钥。
可能就像(如果是php)一样简单 脚本生活在一个网址上 那个剧本生活的网址?
再次不要调用URL但使用消息队列。调用url会给你带来不必要的开销。
真棒。回到SQL :)这将是 即使你追随500,也要快 人? -
SQL会在高负载下为失败的鲸鱼提供大量时间。至少你需要memcached!但我会改用 redis 。