PostgreSQL 有一个很棒的功能,称为 外部数据包装器 (FDW) ,允许它直接连接到 外部系统 。虽然设置可能有点复杂,但一旦它可用,您就可以运行带有连接的查询或针对它们的子查询、插入数据、创建视图等。由于 数据链接 ,Heroku 大大简化了将 FDW 与 PostgreSQL 和 Redis 结合使用的过程。让我们试试看。
“看看@Heroku 如何通过 Postgres 和 Redis 简化使用外部数据包装器。”
数据链
我们以前使用 Heroku PGBackups 的数据链接将我们的实时 PostgreSQL 数据库连接到最近恢复的备份。这使我们能够对两者运行查询以重新加载我们意外删除的数据。那太棒了,我知道……但我们只是触及了表面。
PostgreSQL 很棒。一旦您 利用它的优点, 就会有“没有它我怎么活”的体验。但是尽管有这些特性,它仍然有一些不理想的用例,就像任何其他关系数据库一样。外部数据包装器实际上消除了这个问题,它允许您卸载更适合其他系统的数据部分,同时仍然允许 PostgreSQL 与它们交互并查询它们,就像它们在任何其他表中一样。
事实证明,Redis 非常适合几乎所有 PostgreSQL 可能不理想的情况。作为内存数据存储,它非常适合高流量的直接读写请求,包括排序集、过期数据、pubsub 等特殊数据结构。这些结构提供了与线程系统中的共享对象相当的功能级别,而无需处理线程系统中共享对象的互斥锁和单一系统限制。
“Redis 非常适合几乎所有 PostgreSQL 可能不理想的情况。”
当你把两者放在一起时,你将很难找到一个你无法解决的数据问题,而不仅仅是机器的增长。数据链接将它们放在一起。不客气。
取得联系
请随意与我一起浏览这些代码示例。但是,请注意 Heroku Data Links 仅适用于使用 9.4 及更高版本的生产层 Heroku PostgreSQL 数据库。这意味着您必须付费才能玩。可以 在此处找到 详细说明,但为了让我们更快地炫耀,我将跳过。
使用 Ruby 入门应用程序 设置生产层数据库后,配置 Heroku Redis ,然后将它们链接起来,如下所示:
$ heroku pg:links create REDIS_URL DATABASE_URL --as hredis
并查看它是否有效:
$ heroku pg:links create REDIS_URL DATABASE_URL --as hredis
完美的!现在,让我们玩得开心。
查询外部数据
数据使世界运转,但磁盘写入对机器造成的压力比几乎任何其他事情都大。计数器是说明问题的一个很好的例子,因为您几乎可以将计数器用于任何事情。可以是查看计数器、使用节流计数器、下载计数器、共享计数器、点击计数器等。通常,无论是博客文章、用户记录还是其他内容,都会有某种类型的数据库记录与您正在计算的内容相关联。
PostgreSQL 不会对您的数据冒险,坚持在它告诉您写入成功之前将其写入磁盘。 Redis 可以按一定的时间间隔(例如每秒)写入磁盘,从而使其能够更快地处理这样的逻辑。
这是在 10 个并发线程中对 25 条记录运行增量 50,000 次的快速基准测试,所以很清楚:
$ heroku pg:links create REDIS_URL DATABASE_URL --as hredis
两者通过数据链路连接后,我可以在 PostgreSQL 中运行查询以加入 Redis 数据并将其包含在我的查询结果中,如下所示:
$ heroku pg:links create REDIS_URL DATABASE_URL --as hredis
因为它只是另一个查询,所以我可以从中创建一个视图。或者我可以创建一个 Dataclip 在办公室四处发送。
这只是一个用例,但此时您应该了解如何将实时分析数据包含到您的查询中。要执行更复杂的查询,您可以使用直接引用 Redis 的单个 INSERT/UPDATE 语句定期将需要的值写入 PostgreSQL 中的缓存列。这使得结合 PG 功能以运行全文搜索变得容易得多,该全文搜索在地理上受限于 PostGIS 数据,以高效的方式针对实时/趋势流行数据进行搜索。有很多可能性可以打开。
推出数据
不幸的是,目前 Redis 链接是只读的。当扩展 FDW 功能以 利用写入逻辑 时,它打开了更多的门,例如使用触发器在数据更新时将数据写出到 Redis 或 Memcached 。
在非常高性能的环境中,这可以帮助从 PostgreSQL 完全卸载某些读取流量,方法是让它直接将更改推送到缓存,从而确保缓存管理或过期不再是问题。为了减轻对任何直接包装器限制的担忧,您始终可以利用外部脚本的 LISTEN/NOTIFY 行为将更改也直接推送到缓存。
连接愉快!