【问题标题】:Redis and Postgresql synchronization (online users status)Redis 和 Postgresql 同步(在线用户状态)
【发布时间】:2018-01-19 12:16:01
【问题描述】:

在 NodeJS 应用程序中,我必须保持“最近 N 分钟谁在线”状态。由于可能有成千上万的在线用户 - 出于性能原因 - 我决定不为此任务更新我的 Postgresql user 表。

我选择使用 Redis 来管理在线状态。它非常简单高效。

但现在我想对user 表进行复杂查询,按在线状态排序

我正在考虑从 Redis 快照创建一个每分钟填充一次的 online 表,但我不确定这是否是最佳解决方案。

在表填充之后,引用online 表的下一个查询是否会因新索引的创建或加载而受到很大影响?

有人知道更好的解决方案吗?

【问题讨论】:

  • 什么样的复杂查询?
  • 有一个用于 PostgreSQL 的 redis 外部数据包装器 - github.com/pg-redis-fdw/redis_fdw 我将它用于我们的一个应用程序,通常它工作正常。但是查询总是有一些限制 - 关于它可以翻译和使用的条件。所以你也可以在这里遇到它。另一个 FDW 甚至允许写入 redis - github.com/nahanni/rw_redis_fdw
  • 加上另一个注意事项——你很可能知道——可能比我更好:-)——redis 在事务和隔离级别方面的行为与 PG 不同。因此,使用 FDW,您可能会看到从 redis 中选择的数据存在一些细微的不一致。
  • 用户之间存在关系(朋友、被屏蔽...),因此查询可以是“向我展示具有此类品质的用户,按在线状态排序并丢弃屏蔽我的用户”。

标签: node.js postgresql import redis synchronization


【解决方案1】:

我必须解决几乎完全相同的问题,但我采取了不同的方法,因为我不喜欢尝试混合使用 Redis 和 Postgres 引起的问题。

我的解决方案是在队列中收集在线数据(在我的情况下是零 MQ),但任何排队系统都应该可以工作,或者像 Amazon Kinesis 这样的流处理设施(我看过的替代方案)。然后我将数据插入批处理到第二个表(不是用户表)。我不删除或更新该表,只允许插入和查询。

以这种方式做事保留了在最后一个在线数据和用户表之间进行连接的能力,而不会阻塞数据库或在用户表上创建许多更新。它的副作用是为我们提供了许多其他有用的数据。

在考虑解决此问题的其他解决方案时,需要注意的一点是,您的用户表是事务性数据 (OLTP),而最新的在线信息实际上是分析数据 (OLAP),所以如果您有数据仓库、数据湖、大数据或您想使用的任何一周中的任何术语来存储此类数据并对其进行查询,这可能是更好的解决方案。

【讨论】:

    猜你喜欢
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多