【问题标题】:Redis as a databaseRedis 作为数据库
【发布时间】:2011-06-10 18:27:31
【问题描述】:

我想将 Redis 用作数据库,而不是缓存。根据我(有限的)理解,Redis 是一个内存数据存储。使用 Redis 有哪些风险,我该如何降低这些风险?

【问题讨论】:

    标签: redis


    【解决方案1】:

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

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

    • 使用主从复制see replication docs 运行 Redis。如果您的实例之一发生故障,这将允许您提供高可用性。

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

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

    【讨论】:

    • 如果您只是想避免丢失数据,基本的保存功能可以满足您的大部分需求,而无需进入更复杂的场景——redis 保存文件比 mysql 更容易复制/备份。
    • 这如何回答这个问题?
    • 仅供参考:Redis 的一致性不强,由于异步复制,您可能会在故障转移期间丢失 acked 写入 - redis.io/topics/…
    【解决方案2】:

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

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

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


    【讨论】:

    • 感谢博客链接,以及关于持久性和成熟度的警告。
    • 欢迎您 :) P.S:我非常喜欢 redis,我认为您应该将它用于不那么重要的数据。如果 1 秒的数据丢失不是灾难的话……
    【解决方案3】:

    由于 Redis 是一种内存存储,因此您无法存储不适合您机器内存大小的大数据。当 Redis 存储的数据大于 RAM 大小的 1/3 时,它通常工作得非常糟糕。所以,这是使用 Redis 作为数据库的致命限制。

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

    1. 使用其主从机制将数据复制到第二台机器,现在您拥有相同数据的 2 个副本。
    2. 切断主从连接。
    3. 删除第一台机器上的前半部分数据(通过散列等分割),并删除第二台机器上的后半部分数据。
    4. 如果指定的键在第一台机器上,则告诉所有客户端(PHP、C 等)在第一台机器上运行,否则在第二台机器上运行。

    这就是 Redis 的扩展方式!您还必须停止服务以防止在迁移期间进行任何写入。

    根据我们遇到的经验,我们对 Redis 的结论是:Redis 不是存储超过 30G 数据的正确选择,Redis 不可扩展,Redis 非常适合原型开发。

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

    【讨论】:

      【解决方案4】:

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

      优点:

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

      缺点:

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

      【讨论】:

        猜你喜欢
        • 2013-04-22
        • 2020-03-26
        • 1970-01-01
        • 2021-07-02
        • 1970-01-01
        • 2021-06-05
        • 1970-01-01
        • 1970-01-01
        • 2016-08-12
        相关资源
        最近更新 更多