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

时间:2019-06-08 08:38:21

标签: 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却很昂贵。 (我没有足够的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解决方案快得多吗?

1 个答案:

答案 0 :(得分:2)

  

总而言之,这个redis + postgresql解决方案会比   唯一的postgresql解决方案?

我认为,最终结果不值得您引入系统的工作量/复杂性。

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

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

  • tcp调用redis以获取ID
  • 带有ID的框架SQL查询
  • 通过另一个tcp调用
  • sql查询。

相比之下,如果我们选择简单的方法,则只有一个SQL查询被发送到数据库。

与此同时,还要考虑在确保Redis中提供的ID与数据库服务器保持一致方面所涉及的开发工作。


也就是说,如果您的数据库服务器承受着沉重的负担,并且您需要减轻一些负担,那么您可以考虑将elasticsearch / solr包含在应用程序堆栈中。

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

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