【问题标题】:Store IDs in Redis sorted set and then select value from Postgresql?将 ID 存储在 Redis 排序集中,然后从 Postgresql 中选择值?
【发布时间】:2019-06-08 18:10:44
【问题描述】:

为了更好的分页性能,而不是在 postgresql 中这样做:

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

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

ZREVRANGE message_ids 30 39

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

我之所以不直接将 value 存储在 Redis 中是因为 value 可能很大而且 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);

以上查询来自这个link

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

综上,这个redis+postgresql方案会不会比只有postgresql方案快很多?

【问题讨论】:

    标签: postgresql redis


    【解决方案1】:

    综上,这个redis+postgresql的方案会不会比 只有 postgresql 解决方案?

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

    数据库为此类查询提供了非常好的性能,前提是您为查询的字段编制索引并仅选择您需要的字段。

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

    • tcp 调用 redis 获取 ids
    • 带有 id 的框架 sql 查询
    • 通过另一个 tcp 调用进行 sql 查询。

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

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


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

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

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

    【讨论】:

    • 非常感谢您的回答。我赞成它。我没有将其标记为已接受的答案,因为我也想等待看看其他人会说什么。是的,这是针对网络 + 移动应用程序的。顺便说一句,我实际上使用 redis 作为我的主要存储。 AOF+RDB 可以提供与 postgresql 相同的持久性级别。一般来说,我只会将大数据转储到 postgresql 中。 Postgresql 就像是我当前环境的数据存储,而不是 sql server。由于稍后根据您的建议,我可能会考虑将大部分部分切换到 postgresql。非常感谢。
    • 使用redis作为主存储不推荐。主要是因为您已经说过的原因:RAM 非常昂贵!
    • 是的,没错。 RAM是我目前唯一的问题。我使用 redis 是因为时间复杂度(大 O 表示法)在 Redis 的文档中非常清楚。我不是 sql 或 postgresql 专家。每当我在 postgresql 中进行查询时,我都会质疑自己的时间复杂度,但我对此一无所知。即使使用EXPLAIN ANALYZE 等...,在使用sql server 时,我仍然对所有查询都不是很有信心。
    • 将sql作为主数据存储,然后使用redis优化/缓存需要优化的部分。
    • 是的,大多数人都是这样做的。我会考虑这个。如果我采取这一举措,我需要重新设计整个数据库。 ^_^ 非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 2010-10-28
    • 2011-10-02
    • 2014-12-09
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    相关资源
    最近更新 更多