跟踪每个用户未读消息的最有效方法

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 的更新并且当你在屏幕上打开它时,将它与当前用户和“;”分开,这将帮助你(这是提高你性能的逻辑)。

【讨论】:

以上是关于跟踪每个用户未读消息的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

跟踪 iPhone 位置的最准确方法是啥?

您用来跟踪 CVS 存储库中更改的最有效工具是啥?

Swift - 跟踪自定义键盘上使用的最流行的按钮?

创建跨设备位置跟踪应用程序的最简单方法(全部 1 个应用程序)

有效跟踪最新搜索

如何跟踪具有访问令牌的用户是否仍具有有效会话?