在 NodeJS 应用程序中,我必须保持“谁在最后 N 分钟内在线”状态。由于可能有成千上万的在线用户 - 出于性能原因 - 我决定不为此任务更新我的 Postgresql user
表。
我选择使用Redis来管理在线状态。这非常简单且高效。
但现在我想对 user
表进行复杂查询,按在线状态排序。
我正在考虑创建一个在线
表,每分钟从 Redis 快照中填充一次,但我不确定这是最好的解决方案。
填表后,下一个引用在线
表的查询是否会因新索引的创建或加载而受到重大打击?
有人知道更好的解决方案吗?
最佳答案
我不得不解决几乎完全相同的问题,但我采用了不同的方法,因为我不喜欢尝试混合使用 Redis 和 Postgres 所导致的问题。
我的解决方案是在队列中收集在线数据(在我的情况下为零 MQ),但任何队列系统或流处理工具(如 Amazon Kinesis)(我查看的替代方案)都应该可以工作。然后我将数据插入批处理到第二个表(不是用户表)。我不删除或更新该表,只允许插入和查询。
以这种方式做事保留了在最后的在线数据和用户表之间进行连接的能力,而不会使数据库陷入困境或在用户表上创建许多更新。它的副作用是为我们提供了许多其他有用的数据。
在考虑解决此问题的其他解决方案时要注意的一件事是,您的用户表在事务数据 (OLTP) 中,而最新的在线信息实际上是分析数据 (OLAP),因此如果您有数据仓库、数据湖、大数据或您希望用于存储此类数据并对其进行查询的任何一周术语可能是更好的解决方案。
关于node.js - Redis与Postgresql同步(在线用户状态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48340911/