postgresql - 一批从 PostgreSQL 传输到 Redis 的数据有多少被认为是可靠的?

标签 postgresql redis scalability

在可扩展的系统中,我经常需要从 PostgreSQL 查询数据并将其缓存在 Redis 中。我想知道我一次可以传输多少数据,什么时候需要考虑制作多个批处理或使用消息队列。

一个用例是,当用户登录时,我想将用户好友的所有用户id缓存到Redis。我们是一个社交平台,所以一个用户可能有很多 friend ,1K、10K 甚至更多。

所以当用户登录时,我需要做类似下面的事情(例如 Python,但问题应该是语言不明确)

cur = pg_conn.cursor()
cur.execute('SELECT friend_id FROM friends WHERE user_id = ?', user_id)
friend_ids = [item['friend_id'] for item in cur.fetchall()]
cur.close()
redis.sadd('%s.friends' % user_id, *friend_ids) 

我的问题是,这段代码可以处理多大的数据。假设 friend_id 是一个 UUID(36 字节),我最多可以查询多少个 friend_id,这段代码可以可靠地将这些 id 从 PostgresSQL 传输到 Redis?

影响数据传输大小上限的因素有哪些?假设应用服务器、PostgreSQL 和 Redis 都在 AWS 的同一区域运行。

我所说的可靠是指上面的代码不太可能失败(> 99% 或 99.9% 左右),但不需要像银行那样可靠。

最佳答案

根据redis文档: https://redis.io/commands/sadd

Available since 1.0.0.

Time complexity: O(1) for each element added, so O(N) to add N elements when the command is called with multiple arguments.

SADD 的性能非常好,不会依赖于当前 redis 键的大小,你无法提高此性能(通过建模/更改查询......),它已经是最好的了!

这意味着只有网络(主要是 Redis 和您的服务器之间的 ping 时间,您可以测量)和 N 的大小很重要(主要是因为网络带宽使用)。

Redis 是单线程的,所以一次只处理一个 SADD,你需要非常大的插入(插入很多元素,我觉得 10k 似乎不太令人印象深刻)来减慢 Redis 的速度。在大多数情况下,您更担心 redis 上的内存不足(您应该监督)。

这些参数仅取决于您的基础架构质量,这应该很好(或者您可以通过更改云提供商上的服务器/vpc 轻松改进它)。

如果你真的担心网络上有效载荷的大小,你可以使用一个 lua 脚本来执行 SADD 命令并在调用 redis 之前压缩有效载荷并将其解压缩到脚本中,它应该会减少你的网络负载.

为了可靠性,如果第一个 SADD 因任何原因失败(例如,请参阅断路器模式),最好使用某种自动重试过程将其放入 redis。

关于postgresql - 一批从 PostgreSQL 传输到 Redis 的数据有多少被认为是可靠的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54361003/

相关文章:

postgresql - Sequelize模型不区分大小写

sql - 使用 Join,从多个没有外键的 SQL 表中选择值

c# - StackExchange.Redis:获取 channel 订阅数(即 PUBSUB NUMSUB)

scala - 如何扩展使用 Akka 的 Scala REST 应用程序?

java - 我可以使用 Terracotta 来扩展 RAM 密集型应用程序吗?

javascript - 如何使用 Rails 在开发模式下巧妙地缓存/过期 Assets 文件

php - Symfony Doctrine Group By Query

postgresql - 使用 pglogical 复制插入是否需要主键?

asp.net - 具有 redis 背板横向扩展的 Web 套接字 - 每个用户多个 redis channel 或所有用户一个 redis channel

redis - MISCONF Redis配置保存RDB快照