Heroku 数据链接与 Postgres 和 Redis

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

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 行为将更改也直接推送到缓存。

连接愉快!