Redis可以像PostgreSQL一样将数据写入数据库吗?

26

我一直在使用PostgreSQL,所有数据都存储在Postgres中。最近我研究了redis,它拥有很多强大的功能,否则需要在Django(Python)中编写几行代码才能实现。只要运行Redis的机器没有出现问题,Redis的数据就是持久的,您可以配置它在每1000个键或每5分钟左右写入存储的数据,具体取决于您的选择。

Redis将成为一个很好的缓存,并且肯定会代替我在Python中编写的很多函数(例如用户投票,查看他们的朋友列表等...)。但我的担心是,所有这些数据都需要转移到postgres中。我不信任将这些数据存储在Redis中。我认为Redis是快速检索信息的临时存储解决方案。它非常快速,这远远优于反复对Postgres执行查询。

我假设我唯一可以从Redis写入数据库的方法是通过Django将从Redis获取的“get”查询的结果保存到Postgres数据库中。

这是我能想到的唯一解决方案。您知道其他解决此问题的方法吗?


1
我在这里找到了一个类似的问题:https://dev59.com/MHHYa4cB1Zd3GeqPLW9W?rq=1。我相信提问者正在询问类似的问题,但是答案并不是我所寻找的。 - deadlock
9
我们有一个实现API的Web服务器,并使用Redis作为缓存。当有新数据的POST请求到来时,我们将数据存储在Redis中,并通知后台进程这些新数据,该进程将它们推送到(MySql)数据库(我们使用Redis列表将数据推送到进程)。为了读取数据,我们首先检查Redis,如果数据不存在,则从数据库中获取并放入Redis,然后返回给客户端。 - akonsu
@akonsu,这已经过去了好几年,但你使用那种策略时得到了什么样的性能表现? - user9903
2个回答

32

Redis越来越被用作缓存层,类似于更复杂的memcached,并且在这个角色中非常有用。通常情况下,您使用Redis作为写入透传缓存用于想要持久化的数据,以及写回缓存用于可能需要累积然后批量写入的数据(在这种情况下,您可以承受最近数据的丢失)。

PostgreSQL的LISTENNOTIFY系统非常有用,可用于进行选择性缓存失效,让您在PostgreSQL中更新记录时从Redis中清除记录。

要将其与PostgreSQL结合使用,您会发现Andrew Dunstain和Dave Page正在开发的Redis外部数据包装提供程序非常有趣。

我不知道是否有任何工具可以将Redis变成PostgreSQL的透明写回缓存。它们的数据模型可能太不同了,无法很好地运行。通常情况下,您会将更改写入PostgreSQL,并使用监听/通知将其Redis缓存项失效,然后由缓存管理器工作人员或将更改排队在Redis中,然后让您的应用程序批量读取它们并将它们写入Pg。


我正在开发一个应用程序,其中有一个API方法m()。m()应该从表T中读取字符串,创建一个随机字符串,并在最后将其保存到T中。可能会有1000个线程/用户调用m()。因此,将会有多个选择和多个插入操作。我不能仅仅缓存这些字符串,因为它们会经常失效。我还计划编写一个回写Redis解决方案,使得读写都发生在缓存中(每天加载一次),而MySQL则每小时或每1000条记录更新一次。以上是否仍然是唯一的解决方案? - Asif
@Mustafa 请发表一个新问题,并在新问题中包含此问题的链接。 - Craig Ringer

1

将Redis配置为持久化会显著降低其速度吗?最好使用像Postgres这样的关系型数据库管理系统。 - user1034912
1
亲爱的用户1034912,你毫无根据的猜测的答案是,不会显著减慢Redis的速度。你会注意到我还链接了两个Redis克隆版本,其中一个被设计为持久性主存储。键值存储是键值故事,而不是关系型数据库,反之亦然。不要盲目地认为所有存储需求都可以映射到关系型数据库,也不要认为ACID是世界上唯一的缩写或服务保证类型。如果你想用Postgres,就用Postgres,如果你的数据实际上映射到键值哈希表,就别像“可能也行”这样模糊地思考。 - vectorselector
1
此外,请记住,规范化不必止步于表格粒度。像 Redis 的 Ohm 库证明了即使是复杂的嵌套数据结构也可以用键值存储表示。我并不否认 RDBMS 的广泛使用,也不建议人们将其数据映射到键值缩减中。 我想指出的是,膝反射式的 RDBMS 狂热主义不是一个逻辑上可辩护的立场,而是一种情感上极端的立场。 - vectorselector
1
此外,即使作为缓存或临时存储,有时从 WAL 重建数据列表非常关键。例如:服务器崩溃和用户会话需要快速膨胀到高可用性(HA)辅助服务器的情况。 - vectorselector

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接