跟踪每个用户未读消息的最有效方法
Posted
技术标签:
【中文标题】跟踪每个用户未读消息的最有效方法【英文标题】:Most efficient way to track unread messages per user 【发布时间】:2014-03-27 00:07:22 【问题描述】:我正在开发一个 jQuery Mobile Web 应用程序,公司将能够向某些用户组发送消息(基于他们的个人资料偏好)。
我正在讨论标记每个用户何时阅读最新消息的最有效方法。我考虑过使用会话来尝试跟踪他们上次打开消息页面的时间,并将其与消息的发布时间进行比较。我还考虑了一个带有 message_id 和 user_id 的表,在打开页面时将每个表标记为已读。
我认为两者都可以,但我正在努力平衡利弊。保存在数据库中可以让我保留历史记录(特别是如果我添加了时间戳列以了解他们何时阅读消息),但如果由于表大小会损害应用程序性能,那么它可能不值得它。该应用可能拥有数十万用户。
我可能应该提到的一件事是,用户可能会在多个设备上使用该应用程序,并且该应用程序的会话时间会很长,可能会让用户保持登录数月。我喜欢这样的想法,如果他们在一台设备上阅读它,那么它将在所有设备上标记它已阅读,这可能会使会话难以处理,对吧?
【问题讨论】:
为每条消息添加一个read
列。不应该对性能造成太大影响(如果有的话)。 mysql 是一款功能强大的数据库软件,只要你有不错的服务器和优化,你就可以处理数百万条记录
我不能只在消息表中添加一个已读列,因为一条消息可能来自 1 到 1000 个用户。我正计划在消息表中只保留一行。在消息表中有 1 行和一个带有 message_id、uid 的单独表将它们标记为已读会影响效率吗?
额外表的任何性能变化都可以忽略不计(想想几毫秒)。
另外,另外,您不应该保持会话数月。它非常不安全,因为它为会话劫持打开了一个更大的窗口。相反,您应该在每次访问应用程序时生成一个新会话,并每次使用不同的“记住我”cookie 或其他东西来验证它们。
我相信这实际上是正在发生的事情(我没有亲自编写该代码),但我会仔细检查它。谢谢
【参考方案1】:
好的,我会将我在 cmets 中所说的所有内容都放在一个可靠的答案中。
简短回答:您应该使用数据库来存储“已读”通知
背后的逻辑:
-
即使有数十万用户,使用体面的服务器和优化的代码(最大几毫秒)对性能的影响应该可以忽略不计
高度可维护
您可以跟踪它并跨设备同步它
为什么不应该使用会话
会话旨在存储临时用户数据(想想 ram),它们不应该记录内容。
您不应该保持会话数月。它非常不安全,因为它为会话劫持打开了一个更大的窗口。相反,您应该在每次访问应用程序时生成一个新会话,并且每次都使用不同的“记住我”cookie 或其他东西来对它们进行身份验证。
即使您确实让会话持续数月,但在这些月之后,用户不会突然收到大量“未读”通知吗?
如何将其存储在数据库中 这称为many-to-many
关系(从消息角度)或one-to-many
关系(从用户角度) 表 1:消息
ID, message, timestamp
表 2:messages_users
ID, user_id, message_id, read
表 3:用户
(Do user business as usual)
【讨论】:
所以使用这种方法,当我添加一条消息时,我会在消息中添加一行,然后在messages_users 中添加一行,以便每个用户收到消息,然后将每一行标记为已读他们打开它们来阅读它们,对吗? @TroubleZero Oxford 不同意 :P oxforddictionaries.com/definition/english/bajillion @livewire1407 或者您可以将消息插入表 1,然后仅在用户看到消息时创建表 2 记录。【参考方案2】:我可以做一件事,如果一个用户或 100 个用户没有问题,您创建一个名为 readUnread
的列,其中包含超过 63,999 个字符,您可以在其中使用 0 和 1 分配每个用户的消息,例如 @987654322 @ 当读取从 0 到 1 的更新并且当你在屏幕上打开它时,将它与当前用户和“;”分开,这将帮助你(这是提高你性能的逻辑)。
【讨论】:
以上是关于跟踪每个用户未读消息的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章