Redis是否持久保存数据?

Zur*_*iar 100 redis

我知道Redis提供来自内存的所有数据,但是它在服务器重启时也会持续存在,这样当服务器重新启动时,它会从磁盘读入内存中的所有数据.或者它总是一个空白的商店,只是在应用程序运行时没有持久性存储数据?

Man*_*idt 60

我建议你在http://redis.io/topics/persistence上阅读这篇文章.基本上,当您通过仅使用内存存储来提高性能时,您将失去保证的持久性.想象一下你插入内存但在它被持久化到磁盘失去电源之前的情况.会有数据丢失.

Redis支持所谓的"快照".这意味着它将在某些时间点(例如每整个小时)对内存中的内容进行完整的复制.当您在两个快照之间断电时,您将丢失从上次快照到崩溃之间的时间内的数据(不必是断电......).与大多数NoSQL-DB一样,Redis交易数据安全性与性能.

大多数NoSQL数据库遵循多个节点之间的复制概念,以最大限度地降低此风险.Redis被认为是更快速的缓存,而不是保证数据一致性的数据库.因此,它的用例通常与真实数据库的用例不同:例如,您可以使用无与伦比的性能存储会话,性能计数器或其他任何内容,并且在发生崩溃时不会造成实际损失.但处理订单/购买历史等被视为传统数据库的工作.


Leo*_*tny 25

Redis服务器不时将其所有数据保存到HDD,从而提供一定程度的持久性.

它在以下某种情况下保存了数据:

  • 自动不时
  • 当你手动调用BGSAVE命令
  • 当redis关闭时

但redis中的数据并不是持久的,因为:

  • redis进程崩溃意味着丢失自上次保存以来的所有更改
  • BGSAVE 只有在有足够的可用RAM(额外RAM的数量等于redis DB的大小)时才能执行操作

注意: BGSAVE RAM要求是一个真正的问题,因为redis会继续工作,直到没有更多的RAM运行,但它会更早地停止将数据保存到HDD(大约占RAM的50%).

有关更多信息,请参阅Redis Persistence.

  • 由于写了这个答案,redis 引入了一种称为 AOF 的替代持久性模型,它提供了更高的持久性,但也有一些其他缺点,例如磁盘利用率更高和服务器启动速度更慢。 (8认同)

Chr*_*row 12

答案通常是肯定的,但是更完整的答案实际上取决于您尝试存储的数据类型。一般来说,更完整的简短答案是:

  • Redis 不是持久存储的最佳选择,因为它主要关注性能
  • Redis 确实更适合可靠的内存中存储/缓存当前状态数据,特别是通过为跨多个客户端/服务器使用的数据提供中央源来实现可扩展性

话虽如此,默认情况下 Redis定期保留数据快照(显然这是每 1 分钟一次,但我尚未验证这一点 - 下面的文章对此进行了描述,这是一个很好的基本介绍):

http://qnimate.com/redis-permanent-storage/


TL; 博士

来自官方文档

  • RDB 持久性 [默认]以指定的时间间隔执行数据集的时间点快照。
  • AOF持久化 [需要显式配置]记录服务器收到的每个写操作,在服务器启动时会再次播放,重建原始数据集。

如果需要,Redis 必须为 AOF 持久性显式配置,这将导致性能损失以及日志增长。对于有限数量的数据流的相对可靠的持久性可能就足够了。


Ada*_*tro 10

这是一个配置问题.您可以在Redis上没有,部分或完全持久化数据.最好的决策将取决于项目的技术和业务需求.

根据Redis关于持久性的文档,您可以设置实例,以便不时或在每个查询中将数据保存到磁盘中.他们提供了两种策略/方法AOF和RDB(阅读文档以了解当时的详细信息),您可以单独使用或一起使用.

如果你想要一个"像持久性的SQL",他们说:

一般的迹象是,如果您希望一定程度的数据安全性与PostgreSQL为您提供的数据安全性相当,则应使用两种持久性方法.


fre*_*ver 7

完全可以选择不持久化。性能更好,但是Redis关闭时所有数据都会丢失。

Redis 有两种持久化机制:RDB 和 AOF。RDB 使用调度程序全局快照,AOF 将更新写入类似于 MySql 的仅附加日志文件。

您可以使用其中之一或两者。当Redis重启时,它通过读取RDB文件或AOF文件来构造数据。