Redis作为数据库

时间:2011-01-17 23:02:46

标签: javascript node.js redis

我想将Redis用作数据库,而不是缓存。根据我的(有限)理解,Redis是一个内存数据存储区。使用Redis有什么风险,我该如何减轻它们呢?

4 个答案:

答案 0 :(得分:41)

您可以通过多种不同方式将Redis用作权威商店:

  • 启用 AOF (仅附加文件存储)see AOF docs。这将实时记录针对您的数据集所做的所有Redis命令。

  • 使用主从复制see replication docs运行Redis。如果您的某个实例失败,这将允许您提供高可用性。

  • 如果你正在使用像EC2这样的东西,你可以EBS支持你的Redis分区,以提供另一层防止实例失败的保护。

即将出现Redis Cluster - 这是专门设计的一种以有助于提高HA和可扩展性的方式运行Redis的方法。但是,至少再过六个月左右就不会出现这种情况。

答案 1 :(得分:13)

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

但我仍然不确定redis是否处于尚未真正存储(任务)关键数据的状态(但是?)。例如,当另外一条推文(twitter.com)或类似的东西丢失时,这不是一个大问题,那么我肯定会使用redis。在redis自己的网站上也有很多关于persistence的信息。

您还应该通过阅读antirez(redis维护者)博客文章了解some persistence problems。你应该阅读他的博客,因为他有一些有趣的文章。


答案 2 :(得分:4)

由于Redis是内存存储,因此无法存储不符合计算机内存大小的大数据。当存储的数据大于RAM大小的1/3时,Redis通常工作得非常糟糕。因此,这是将Redis用作数据库的致命限制。

当然,您可以将大数据分发到多个Redis实例中,但您必须自己手动完成所有操作。操作通常是这样的(假设你从开始只有1个实例):

  1. 使用其主从机制将数据复制到第二台机器,现在您有2份相同的数据。
  2. 切断主站和从站之间的连接。
  3. 删除第一台机器上的数据的前半部分(通过哈希等分割),并删除第二台机器上的后半部分数据。
  4. 如果指定的密钥在该计算机上,则告知所有客户端(PHP,C等)在第一台计算机上运行,​​否则在第二台计算机上运行。
  5. 这是Redis如何扩展的方式!您还必须停止服务以防止在迁移期间进行任何写入。

    在我们遇到的情况下,我们得到Redis的结论: Redis不是存储30G以上数据的正确选择,Redis不可扩展,Redis非常适合原型开发。 < / p>

    我们后来找到了Redis的替代品,即SSDB(https://github.com/ideawu/ssdb),一个支持几乎所有Redis API的leveldb服务器,它适用于存储超过1TB的数据,仅依赖于你硬盘的大小。

答案 3 :(得分:1)

我想在我们的服务中使用Redis作为主数据库来分享我们学到的一些东西。我们选择Redis,因为我们有无法分区的数据。我们希望从一个方框中获得最佳性能

<强>优点:

  • Redis在原始表现方面无与伦比。我们开箱即可获得每秒10K的事务处理(请注意,一个事务涉及多个Redis命令)。经过一些优化后,我们能够达到每秒25K +事务的速率以及LUA脚本。因此,当谈到每盒性能时,Redis是无与伦比的。
  • Redis设置非常简单,与其他SQL和NoSQL数据存储区相比,学习曲线非常小。

<强>缺点:

  • Redis仅支持几个原始数据结构,如散列,集合,列表等,以及对这些数据结构的操作。当您使用Redis作为缓存时,这些已经足够了,但如果您想将Redis用作完整的主数据存储,您会感到受限制。我们很难使用这些简单的类型来建模数据需求。
  • 我们在Redis看到的最大问题是缺乏灵活性。一旦解决了数据结构,对存储要求或访问模式的任何修改实际上都需要重新考虑整个解决方案。不确定是否所有NoSQL数据存储都是这种情况(我听说MongoDB更灵活,但我自己没有使用过它)
  • 由于Redis是单线程的,因此CPU利用率非常低。您不能将多个Redis实例放在同一台机器上以提高CPU利用率,因为它们将竞争同一磁盘,从而使磁盘成为瓶颈。
  • 缺乏横向可扩展性是其他答案所提到的问题。