一批从 PostgreSQL 传输到 Redis 的数据有多少被认为是可靠的?
How much data transferred from PostgreSQL to Redis in one batch is considered reliable?
在可扩展的系统中,我经常需要从PostgreSQL 查询数据并将其缓存在Redis 中。我想知道我一次可以传输多少数据,什么时候需要考虑制作多个批次或使用消息队列。
一个用例是,当用户登录时,我想将用户的好友的所有用户id缓存到Redis。我们是一个社交平台,所以一个用户可能有很多朋友,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 查询数据并将其缓存在Redis 中。我想知道我一次可以传输多少数据,什么时候需要考虑制作多个批次或使用消息队列。
一个用例是,当用户登录时,我想将用户的好友的所有用户id缓存到Redis。我们是一个社交平台,所以一个用户可能有很多朋友,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。