在NodeJS应用程序中,我必须维护一个在过去N分钟内在线的人员#34;州。由于可能有数千名在线用户 - 出于性能原因 - 我决定不为此任务更新我的Postgresql user
表。
我选择使用Redis来管理在线状态。它非常简单有效。
但现在我想对user
表格进行复杂查询,按排序在线状态。
我在考虑从Redis快照创建一个每分钟填充一次的online
表,但我不确定它是最好的解决方案。
在表填充之后,引用online
表的下一个查询是否会因创建或加载新索引而受到重创?
有谁知道更好的解决方案?
答案 0 :(得分:0)
我必须解决几乎同样的问题,但我采取了不同的方法,因为我不喜欢试图混合Redis和Postgres引起的问题。
我的解决方案是收集队列中的在线数据(在我的情况下为零MQ),但任何排队系统都应该工作,或者像Amazon Kinesis这样的流处理设施(我看过的替代方案)。然后我将数据插入批量到第二个表(不是用户表)。我不会删除或更新该表,只允许插入和查询。
这样做可以保留在最后一个在线数据和用户表之间进行连接的能力,而不会使数据库陷入困境或在用户表上创建许多更新。它具有给我们提供许多其他有用数据的副作用。
有一点需要注意的是,我在考虑解决此问题的其他解决方案时,您的用户表是事务数据(OLTP),而最新的在线信息实际上是分析数据(OLAP),因此如果您有数据仓库,数据湖,大数据或您希望用于存储此类数据的一周中的任何术语,并查询它可能是更好的解决方案。