代码之家  ›  专栏  ›  技术社区  ›  Ryan Oberoi

在一个在线提要聚合器实现中,有什么好的算法可以保持未读项目的计数?

  •  0
  • Ryan Oberoi  · 技术社区  · 16 年前

    设计范式 可以在服务器上使用它在短时间内为用户订阅的每个提要计算[feed id,num_unread]。

    假设有大量用户,并且提要在后端定期更新。

    编辑:我想解决Nick J提出的问题(见下文)。但我很感激克莱特斯发布的解决方案。我不太担心db查询,但希望有一个“设计范例”——比如保持一个看门狗进程,将未读计数保存在内存中,以便在任何时候都可以为其服务。

    1 回复  |  直到 16 年前
        1
  •  1
  •   cletus    16 年前

    我不确定该确切地告诉你什么,因为你的问题相当简单。

    首先,使用 Google Reader 作为在线提要聚合器/阅读器的参考。如果你想重新创建这个功能,谷歌阅读器已经很好地实现了(imho)。

    GoogleReader只需存储提要列表即可工作。在DB术语中,您可能有这些实体

    User: id, name, email, etc...
    Feed: id, feed_name, feed_url
    Content: id, feed_id, title, content
    User Feed: id, user_id, feed_id, user_label, has_read
    

    SELECT COUNT(1)
    FROM user u
    JOIN user_feed uf ON uf.user_id = u.id
    JOIN feed f ON f.id = uf.feed_id
    WHERE has_read = 0
    

    按提要列出的未读项目:

    SELECT feed_id, feed_name, COUNT(1)
    FROM user u
    JOIN user_feed uf ON uf.user_id = u.id
    JOIN feed f ON f.id = uf.feed_id
    WHERE has_read = 0
    GROUP BY feed_id, feed_name
    

    然后,您只需要一些机制来将项目标记为已读。在GoogleReader的例子中,只有由鼠标悬停事件触发的AJAX调用,这些调用带有附加链接,用于将所有内容标记为已读,将某个项目标记为未读,等等。