postgresql - 将 ID 存储在 Redis 排序集中,然后从 Postgresql 中选择值?

标签 postgresql redis

为了获得更好的分页性能,而不是在 postgresql 中执行此操作:

SELECT * FROM message ORDER BY created_at DESC limit 30 offset 30;

我可以将 ID 存储在 Redis 排序集中,然后通过以下方式简单地从 Redis 获取 ID:

ZREVRANGE message_ids 30 39

然后在postgresql中查询这些ID来获取值。

我不直接在 Redis 中存储值的原因是因为值可能很大,而且 RAM 很昂贵。 (我没有足够的内存)。

如果建议这样做或可以这样做以提高性能,我如何正确地通过 ID 查询 postgresql 中的值?

我发现了以下方法,但不确定这是否是最好的方法:

SELECT m.*
FROM   unnest('{17579, 17580, 17582}'::int[]) id
JOIN   message m USING (id);

或者简单地说:

SELECT * FROM message WHERE id IN (17579, 17580, 17582);

The above query is from this link

顺便说一句,我也不确定上面的命令是否会根据 id 列表的顺序给出正确的顺序,以及最终是否需要 ORDER BY id

综上所述,这个 redis+postgresql 解决方案会比仅 postgresql 解决方案快很多吗?

最佳答案

In summary, will this redis+postgresql solution be much faster than only postgresql solution?

在我看来,最终结果不值得您在系统中引入的精力/复杂性。

只要您对要查询的字段建立索引并仅选择所需的字段,数据库就可以为此类查询提供非常好的性能。

在您提出的解决方案中,当应用程序尝试提供页面服务时(它是一个 Web 应用程序,对吗?),会发生以下情况:

  • tcp 调用 redis 来获取 id
  • 使用 ID 构建 SQL 查询
  • 通过另一个 TCP 调用进行 SQL 查询。

相比之下,如果我们选择直接方式,则只有一个 sql 查询被发送到数据库。

同时,还要考虑确保输入到 Redis 中的 ID 与数据库服务器保持一致所涉及的开发工作。


也就是说,如果您的数据库服务器负载很重,并且您需要减轻其肩上的一些负担,您可以考虑将 elasticsearch/solr 包含到您的应用程序堆栈中。

  • 您仍然必须确保数据库和 elasicsearch/solr 之间的一致性。如果您的用例允许,您可能可以通过后台作业来做到这一点。
  • 您的读取请求很少会到达您的数据库服务器。
  • Elasticsearch/solr 使用硬盘存储数据:不需要过多的内存。

您还可以考虑为 postgresql 设置复制,以分配只有一台数据库服务器可能无法处理的负载。

关于postgresql - 将 ID 存储在 Redis 排序集中,然后从 Postgresql 中选择值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56504830/

相关文章:

docker - 如何从 Docker 容器连接到本地 Redis 服务器?

node.js - 用node实现redis时,如何将多个json对象添加到hmset或hset或任何数据类型?

Postgresql LEFT JOIN json_agg() 忽略/删除 NULL

postgresql - 如何使用 Zabbix 通过简单的无代理检查来配置数据库服务状态

PostgreSQL - 从函数返回 n 大小的 varchar

java.lang.NumberFormatException : For input string: 异常

javascript - 如何将 PostgreSQL 时间戳与 moment.js 进行比较并仅在日期基础上指定?

javascript - 如何使用 ioredis 在 nodejs 中链接返回?

redis - 使用 Redis 的应用程序的数据模型设计

node.js - 设置 redis 环境变量 -- Openshift 上的 Node.js