你需要redis吗? 如何逃避Postgres

2021-06-12 15:20:11

有一种尝试和真实的架构,我已经看到了很多次,以支持您的Web服务和应用程序:

Redis很棒,但如果我告诉你这堆栈最常见的用例,实际上只能使用PostgreSQL实现它最常见的用例吗?

也许我所看到的Redis最常见的用途是协调从您的Web服务向一家背景工人派遣工作。该概念是您希望录制要执行的一些背景作业的欲望(或许有一些输入数据),并确保您的许多背景工人只能拾取它。 Redis帮助此功能,因为它为其数据结构提供了丰富的原子操作集。

但自版本9.5引入以来,PostgreSQL为Select ...有一个Skiplocked选项...对于...语句(这是文档)。指定此选项后,PostgreSQL将忽略需要等待释放锁的任何行。

作业为(选择身份的工作=&#39的作业;待定'更新跳过的限制1)更新Jobsset Status ='运行' whating.id = Job.idreturn作业。*;

通过指定更新跳过锁定,隐式获取行级锁定,用于从“选择”返回的任何行。此外,因为您指定了跳过锁定,其中没有机会在另一个交易中阻止这种陈述。如果有另一份作业准备好进行处理,则将返回。没有担心运行此命令的多个工人因行级锁而接收同一行的多个工人。

这项技术的最大警告是,如果你有大量的工人试图脱掉这个队列和大量的工作喂养它们,他们可能会花一些时间踩到工作并试图获得锁定。在实践中,大多数应用程序I' ve工作的少于十几个背景工人,成本不太可能很重要。

让&#39想象一下,您可以使用第三方服务具有同步例程,并且您只希望在所有服务器进程中为任何给定用户运行的一个实例。这是另一种常见的应用程序I'已经看过Redis:分布式锁定。

PostgreSQL可以使用其咨询锁来实现这一目标。咨询锁允许您利用相同的锁定引擎PostgreSQL在内部用于您自己的应用程序定义的目的。

我保存最新的榜样:将事件推到活动客户端。例如,假设您需要通知用户它们具有可用于读取的新邮件。或者,也许是您喜欢将数据传输到客户端,因为它可用。通常,幅材套接字是这些事件的传输层,而Redis用作PUB /子引擎。

但是,由于版本9,PostgreSQL还通过侦听和通知语句提供此功能。任何PostgreSQL客户端都可以订阅(侦听)到特定的消息频道,这只是一个任意字符串。当任何其他客户端在该频道上发送消息(通知)时,将通知所有其他订阅的客户端。可选地,可以附加小消息。

如果您碰巧使用Rails和ActuctCable,甚至支持使用PostgreSQL。

Redis从根本上填充了不同的利基,而不是PostgreSQL,并在PostgreSQL的事物中求追求。示例包括使用TTL和存储和操作短暂数据缓存数据。

然而,PostgreSQL的能力比你可能期望的更多功能,当您从另一个SQL数据库或某些留在您的ORM后面的神秘实体的角度来看时。

在那里有一个很好的机会,你'使用redis的事情实际上是PostgreSQL的好任务。 它可能是一个有价值的权衡,用于跳过Redis并节省依赖于多个数据服务的运营成本和发展复杂性。