Redis作为一个数据库

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

您可以使用Redis作为许多不同方式的权威商店:

  • 打开AOF (仅附加文件存储) 请参阅AOF文档 。 这将实时logging针对您的数据集的所有Redis命令。

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

  • 如果你运行的是类似于EC2的东西,那么你可以使用EBS来备份你的Redis分区,以提供另一层防范实例失败的保护。

Redis Cluster即将面世 – 这是专门devise的一种运行Redis的方式,应该有助于提高HA和可伸缩性。 但是,这至less在六个月左右才会出现。

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

但是,我仍然不确定redis是否处于状态,但是还没有真正存储(使命)关键数据。 例如,如果有1个推文(twitter.com)或类似的东西丢失了,那么这个问题就不是一个大问题,那么我肯定会使用redis。 在redis自己的网站上还有大量关于持久性的信息。

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


由于Redis是内存中的存储设备,因此无法存储不适合您计算机内存大小的大量数据。 当它存储的数据大于RAM大小的1/3时,Redis通常工作得非常糟糕。 所以,这是使用Redis作为数据库的致命缺陷。

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

  1. 使用其主从机制将数据复制到第二台机器,现在您有两份相同的数据。
  2. 切断主从机之间的连接。
  3. 删除第一台机器的前半部分(散列等),删除第二台机器的后半部分。
  4. 告诉所有客户端(PHP,C等)在第一台机器上运行,如果指定的密钥在该机器上,则在第二台机器上运行。

这就是Redis如何扩展的方式! 您还必须停止服务,以防止在迁移过程中发生任何写入。

对于我们遇到的问题,我们对Redis有这样一个结论: Redis不是存储超过30G数据的正确select,Redis不可扩展,Redis非常适合原型开发。

后来我们find了一个Redis的替代scheme,那就是SSDB( https://github.com/ideawu/ssdb ),一个支持几乎所有Redis API的leveldb服务器,它适合存储超过1TB的数据,取决于你硬盘的大小。

我想分享一些我们通过在服务中使用Redis作为主要数据库的知识。 我们select了Redis,因为我们有无法分割的数据。 我们想要获得最好的performance,我们可以从一个盒子里得到

优点:

  • Redis在原始performance上是无与伦比的。 我们每秒得到10K个事务(注意,一个事务涉及多个Redis命令)。 在经过几次优化之后,我们能够达到每秒25K次交易的速度,以及LUA脚本。 所以当谈到每盒的性能时,Redis是无与伦比的。
  • 与其他SQL和NoSQL数据存储相比,Redis安装非常简单,学习曲线非常小。

缺点:

  • Redis只支持一些简单的数据结构,如哈希,集合,列表等,以及对这些数据结构的操作。 当您使用Redis作为caching时,这些已经足够了,但是如果您想将Redis用作完整的主数据存储,则会感到受到限制。 我们用这些简单的types来模拟我们的数据需求非常困难。
  • 我们在Redis看到的最大的问题是缺乏灵活性。 一旦解决了数据结构,对存储要求或访问模式的任何修改实际上都需要重新思考整个解决scheme。 不知道是否所有的NoSQL数据存储都是这样(我听说MongoDB更灵活,但没有使用它自己)
  • 由于Redis是单线程的,CPU利用率非常低。 您不能将多个Redis实例放在同一台计算机上,以提高CPU利用率,因为它们将争夺相同的磁盘,从而使磁盘成为瓶颈。
  • 如其他答案所述,缺less横向可伸缩性是一个问题。