【问题标题】:How to do pagination for chat app messages如何为聊天应用消息进行分页
【发布时间】:2021-08-19 11:14:52
【问题描述】:

我正在尝试构建一个实时聊天应用程序。 它需要做什么:

  • 允许用户在“聊天”中向其他用户发送消息,类似于 whatsapp 和 messenger 等应用上的私人聊天。
  • 在用户向聊天发送消息后,其他用户需要通过更新他们的聊天数据来立即接收消息。

我想知道的是如何处理这类问题的分页。

如果用户向上滚动并尝试获取他们的旧聊天数据(消息历史记录),我可以在数据库上进行分页,但是,如果聊天中的其他用户发送消息,即为此向数据库添加新消息聊天,这会立即将整个聊天历史记录/分页偏移一个(每发送一条消息一个)。这当然会导致重复消息。反之亦然,如果其他用户删除了一条消息,那么我们的聊天历史分页将返回缺失的结果。当然,这只发生在我们的用户正在滚动查看聊天记录而其他用户正在发布/删除消息时。

目前我正在考虑通过在客户端上最旧消息的最接近纳秒的日期时间之前或等于日期时间的最后一个结果来考虑这样做。然后,接收到数据后,检查新数据(聊天记录)的第一条消息(新分页聊天记录中的最新消息)id是否与 最新的数据(客户端)并将其弹出(应该总是这样?我想???)。这对我来说似乎是一个黑客。如果我错了,请纠正我。

我使用的后端是用 django 包裹的 Postgres。除了分页 postgres 包装器之外,Django 没有为此提供解决方案。我也在寻找可以通过 id 做到这一点的东西。即我可以去数据库,然后说:'哟 postgres,给我 30 个按日期时间排序的结果,但只返回 id 459432 之前的结果......以及其他一些东西。'

我也可以通过获取给定聊天的整个聊天历史记录并实现我刚才所说的来做到这一点,但那时我也可以存储整个客户端并让客户端应用程序处理渲染和存储它。由于这是一个小型应用程序,消息历史记录不太可能有数万条消息……但谁知道呢。我不相信用户不会坐在那里发垃圾邮件。

【问题讨论】:

    标签: django postgresql chat


    【解决方案1】:

    既然是聊天记录,你肯定知道不会突然出现旧消息。您需要做的就是确保在加载旧消息时,新消息不会改变分页的起点。

    在客户端,当您第一次打开聊天窗口时,将当前时间存储为您的“寻呼截止时间”。在查询特定页面的数据库时,在执行跳过/获取之前丢弃所有比“分页截止时间”更新的消息。

    删除消息时可能会遇到问题,具体取决于您的实现。

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2020-01-22
      • 1970-01-01
      相关资源
      最近更新 更多