Redis作为数据库

67

我想把Redis用作数据库,而不是缓存。据我(有限的)理解,Redis是一种内存数据存储。使用Redis的风险是什么,如何减轻这些风险?


Redis在过去的几年里取得了长足的进步。我认为这些问题和答案需要重新审视。Redis已经添加了许多新的数据存储方式,包括JSON。 - Mark A
5个回答

52
您可以以多种不同的方式使用Redis作为权威存储:
  • 打开AOF(附加文件存储)请参阅AOF文档。这将实时记录针对数据集执行的所有Redis命令。

  • 使用主从复制请参阅复制文档运行Redis。如果其中一个实例失败,这将允许您提供高可用性。

  • 如果您正在运行EC2之类的东西,可以EBS备份Redis分区以提供另一层保护,防止实例故障。

在地平线上是Redis Cluster-这是专门设计的一种运行Redis的方式,应该有助于HA和可扩展性。但是,这至少还需要六个月左右才会出现。


2
如果您只是想避免数据丢失,基本的保存功能就可以满足大部分需求,而不必涉及更复杂的情况——Redis保存文件比MySQL更容易复制/备份。 - Tom Clarkson
这个回答如何回答这个问题? - Yerken
1
注意:Redis不具备强一致性,在故障转移期间,由于异步复制,您可能会丢失已确认的写入数据。请参考https://redis.io/topics/cluster-tutorial#redis-cluster-consistency-guarantees。 - Sanjeev Kumar Dangi

16

Redis是一个内存存储器,也可以将数据写回磁盘。您可以指定要执行多少次fsync以使Redis更安全(但速度较慢 =>权衡)。

但我仍然不确定Redis是否已经处于真正存储(任务)关键数据的状态(还是?)。例如,如果1个以上的推文(twitter.com)或类似内容丢失并不是什么大问题,那么我肯定会使用Redis。Redis的官方网站上还提供了大量与持久性相关的信息。

您还应该注意一些可能发生的持久性问题,可以通过阅读Antirez(Redis维护者)的博客文章了解。您应该阅读他的博客,因为他有一些有趣的文章。



1
感谢您提供的博客链接,以及在持久性和成熟度方面的警告。 - Paddy
你好 :) 附言:我非常喜欢Redis,并且我认为你应该在处理不太重要的数据时使用它。如果丢失一秒钟的数据不会带来灾难... - Alfred

12
我想分享一下我们在使用Redis作为主数据库时所学到的一些东西。我们选择Redis是因为我们有无法分区的数据。我们希望在一个盒子上获得最佳性能。
优点:
- Redis在原始性能方面无与伦比。我们可以通过一个盒子得到每秒10K次事务(请注意,一个事务涉及多个Redis命令)。经过一些优化和LUA脚本,我们能够达到每秒25K+的事务速率。因此,在每箱性能方面,Redis是无与伦比的。 - 与其他SQL和NoSQL数据存储相比,Redis的设置非常简单,学习曲线非常小。
缺点:
- Redis仅支持几种基本数据结构,如哈希、集合、列表等以及这些数据结构的操作。当您将Redis用作缓存时,这些足以胜任,但如果您要将Redis用作全功能主数据存储,则会感到受限制。我们需要花费很长时间使用这些简单类型来对数据需求进行建模。 - 我们看到Redis的最大问题是缺乏灵活性。一旦您解决了数据的结构,任何对存储要求或访问模式的修改实际上都需要重新思考整个解决方案。不确定这是否适用于所有NoSQL数据存储(我听说MongoDB更灵活,但我自己没有使用过)。 - 由于Redis是单线程的,CPU利用率非常低。您无法将多个Redis实例放在同一台机器上以提高CPU利用率,因为它们会争夺同一硬盘,使硬盘成为瓶颈。 - 缺乏水平可扩展性是其他答案所提到的问题。

1
Redis已经添加了更多的数据存储结构,包括JSON。请查看Elasticache。 - Mark A

8
作为一种内存存储系统,Redis无法存储超出机器内存大小的大量数据。当Redis存储的数据大于RAM大小的1/3时,Redis通常表现非常糟糕。因此,这是使用Redis作为数据库的致命限制。
当然,您可以将大型数据分发到几个Redis实例中,但必须手动完成所有操作。操作通常如下(假设您从一开始只有一个实例):
1. 使用主从机制将数据复制到第二台机器,现在您有两份相同的数据副本。 2. 切断主从之间的连接。 3. 在第一台机器上删除数据的前半部分(通过哈希等方式进行拆分),并在第二台机器上删除数据的后半部分。 4. 告诉所有客户端(PHP、C等)如果指定的键在第一台机器上,则在第一台机器上操作,否则在第二台机器上操作。
这就是Redis扩展的方法!您还必须停止服务以防止迁移期间的任何写入。
根据我们的经验,我们得出了关于Redis的结论:Redis不适合存储超过30G的数据,Redis不可扩展,Redis非常适合原型开发。 后来我们找到了Redis的替代品,那就是SSDB(https://github.com/ideawu/ssdb),它是一个支持几乎所有Redis API的leveldb服务器,适合存储超过1TB的数据,这只取决于您硬盘的大小。

-1
Redis是一种数据库,这意味着我们可以将其用于持久化任何类型的应用程序信息,例如用户帐户、博客文章、评论等等。存储信息后,我们可以通过编写查询语句稍后检索它。
现在,这种行为与几乎所有其他数据库类似,但是有什么区别?或者说,为什么我们会使用它而不是其他任何数据库?
Redis运行速度快。
Redis之所以快,并非因为它是使用特殊编程语言编写的,而是因为所有数据都存储在内存中。
大多数数据库将所有信息存储在计算机的内存和硬盘之间。访问内存中的数据很快,但获取存储在硬盘上的数据相对较慢。
因此,Redis决定将内存中的数据存储在内存中,而不是存储在硬盘中。
现在,这样做的缺点是处理大于计算机内存量的数据时,这种方法是行不通的。
这听起来可能是一个巨大的问题,但Redis有明确的解决此限制的策略。
以上只是Redis之所以如此快的第一个原因。
第二个原因是Redis将所有数据存储或组织为简单的数据结构,如“双向链表”,“排序集”等。
这些数据结构具有众所周知和充分理解的性能特征。因此,作为开发人员,我们可以决定我们的信息如何组织以及如何高效地查询数据。
Redis也非常快,因为它的本质很简单,它不会增加太多功能; 像Postgres这样的功能重型数据存储在性能方面会受到惩罚。
因此,要将Redis用作数据库,您必须知道如何在有限的空间中存储,必须知道如何将其组织成上述简单的数据结构,并且必须了解如何绕过有限的功能集。
因此,就缓解风险而言,您开始做的方法是开始考虑Redis设计方法论,而不是SQL数据库设计方法论。我是什么意思?
因此,与其说步骤1.将数据放入表格,步骤2.弄清楚我们将如何查询它。
使用Redis更多的是:
步骤1.弄清楚我们需要回答哪些查询。
步骤2.构造最佳数据来回答这些查询。

请注意你的拼写,丹尼尔。如果你为了风格而省略撇号,请注意这会影响可读性。此外,这只会给志愿者带来编辑工作。 - halfer

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