django - 如何为聊天应用消息进行分页
问题描述
我正在尝试构建一个实时聊天应用程序。它需要做什么:
- 允许用户在“聊天”中向其他用户发送消息,类似于在 whatsapp 和 messenger 等应用上的私人聊天。
- 在用户向聊天发送消息后,其他用户需要通过更新他们的聊天数据来立即接收该消息。
我想知道的是如何处理这类问题的分页。
如果用户向上滚动并尝试获取他们的旧聊天数据(消息历史记录),我可以在数据库上进行分页,但是,如果聊天中的其他用户发送消息,即为该聊天向数据库添加新消息,这立即将整个聊天历史记录/分页偏移一个(每发送一条消息一个)。这当然会导致重复消息。反之亦然,如果其他用户删除了一条消息,那么我们的聊天历史分页将返回缺失的结果。当然,这只发生在我们的用户正在滚动查看聊天记录而其他用户正在发布/删除消息时。
目前我正在考虑通过在客户端上最旧消息的最接近纳秒的日期时间之前或等于日期时间的最后一个结果来考虑这样做。然后,接收到数据后,检查新数据(聊天记录)的第一条消息(新分页聊天记录中的最新消息)id是否与最新数据(客户端)相同并弹出(这个应该总是这样吗?我想???)。这对我来说似乎是一个黑客。如果我错了,请纠正我。
我使用的后端是用 django 包裹的 Postgres。除了分页 postgres 包装器之外,Django 没有为此提供解决方案。我也在寻找可以通过 id 做到这一点的东西。即我可以去数据库,然后像:'哟 postgres,给我 30 个按日期时间排序的结果,但只返回 id 459432 之前的结果......以及其他一些东西。
我也可以通过获取给定聊天的整个聊天历史记录并实现我刚才所说的来做到这一点,但那时我也可以存储整个客户端并让客户端应用程序处理渲染和存储它。由于这是一个小型应用程序,消息历史记录不太可能有数万条消息……但谁知道呢。我不相信用户不会坐在那里发送垃圾邮件。
解决方案
因为它是一个聊天记录,你肯定知道不会突然出现旧消息。您需要做的就是确保在加载旧消息时,新消息不会改变分页的起点。
在客户端,当您第一次打开聊天窗口时,将当前时间存储为您的“寻呼截止时间”。在查询特定页面的数据库时,请在跳过/获取之前丢弃所有比“分页截止时间”更新的消息。
根据您的实施,您在删除消息时可能会遇到问题。
推荐阅读
- php - SQL排序查询
- node.js - 电子:无法读取未定义的属性“发送”
- ios - iOS UIView 在屏幕旋转时闪烁
- javascript - 在 Electron js 中模板化数据库查询
- scala - 使用“测试”范围定义的父项目的依赖关系在派生项目中不可见
- html - Colspan 和表格布局:修复破坏我的表格样式
- javascript - 给定 X 次掷骰子输入,生成特定数字
- python - 从 mongo 获取数据时对函数应用限制
- wordpress - 如何在 BBPRESS 论坛页面上添加分页?
- javascript - 当 Ruby on Rails 中的 date_select 值更改时调用 javascript