redis持久化

目录

持久化

快照

1.特点

2.快照生成方式

3.快照方式总结

AOF

1.特点

2.开启AOF持久化

3.日志追加频率

4.AOF文件的重写

4.1.AOF带来的问题        

4.2触发重写方式

4.3重写的原理

总结


持久化

Redis官方提供了两种持久化的方式,分别是:

  • RDB快照(snapshot):保存某一时刻redis中的所有数据状态,需要时恢复快照即可回到快照的状态
  • AOF(Append Only File)追加日志文件:将所有redis的写命令记录到日志文件中,恢复时重新执行这些日志中的命令即可

快照

1.特点

这种方式可以将某一时刻的所有数据都写入硬盘中,当然这也是redis的默认开启持久化方式,保存的文件是以.rdb形式结尾的文件因此这种方式也称之为RDB方式。

2.快照生成方式

  • 客户端方式:通过BGSAVESAVE命令
  • 服务器配置自动触发,如下查看redis的安装目录可以看到系统自动生成的快照

BGSAVE和SAVE命令只需要在客户端下直接输入命令即可在redis目录中生成,比较简单。

1.BGSAVE和SAVE的区别

  • BGSAVE命令会调用fork系统调用来创建一个子进程,然后该子进程生成对应的快照并写入磁盘中,父进程不需要管,只需要完成自己的事情,继续处理命令请求。BG就是background后台执行的意思。

  •  SAVE:当redis服务器接收到SAVE命令时,创建快照的操作是交给redis服务器自己去做的,创建快照期间是不会响应任何其他的命令的,就是前台执行,这种方式不建议使用,如果创建快照的操作比较慢,对客户端请求不友好。

2.服务器配置方式自动触发快照生成

用户在redis.conf中设置save配置选项,redis会在save选项满足条件之后自动触发一次BGSAVE命令(注意不是save命令),可以设置多个save选项。如下

 还有一种情况就是客户端使用shutdown命令关闭redis服务器时,服务器会自动触发save命令创建一次快照,注意不是bgsave

另外也可以再配置文件中自定义快照的文件名和生成的目标目录,如下,其中的目录是基于redis-server脚本启动的目录。

3.快照方式总结

服务器每次开启时都回去加载那个生成的快照,如果把快照删除了再开启,那在redis服务器中就不会有任何数据了。

 缺点:

有丢失数据的风险,如果在客户端修改了数据后,服务器还没到时间更新快照,突然服务器宕机了,那么刚刚修改的数据就会丢失。

AOF

为了避免快照的数据丢失的风险,redis提供了AOF追加文件的方式,AOF持久化更能保护数据的完整性,但是丢失数据也是不可避免的,只能在最低限度保护数据。

1.特点

这种方式可以将所有客户端执行的写命令记录到日志文件中,AOF持久化会将被执行的写命令写到AOF的文件末尾,以此来记录数据发生的变化,因此只要redis从头到尾执行一次AOF文件所包含的所有写命令,就可以恢复AOF文件的记录的数据集。

2.开启AOF持久化

在redis的默认配置中AOF持久化机制是没有开启的,需要在配置文件中开启。

3.日志追加频率

当我们开启AOF功能后,并不是输入一个更新数据的命令就立即把该命令同步到appendonly.aof文件中,redis中默认的是每一秒钟同步一次命令到文件。

redis也提供了三种追加频率:

  • always:每个redis写命令都同步写入到磁盘,这种方式可以将数据丢失的风险降低到最小,但是验证影响效率,需要谨慎使用
  • everysec:每一秒钟同步一次,将多个写命令写入到磁盘中,可以保证用户最多丢失一秒之内产生的数据
  • no:由操作系统决定何时同步,不推荐

如下可以修改该配置

AOF和RDB持久性可以同时启用,不会出现问题。如果同时启动,Redis将加载AOF,即文件具有更好的耐久性保证。

4.AOF文件的重写

4.1.AOF带来的问题        

AOF相比快照方式更安全,最多丢失1秒的数据,但是AOF也有一个问题,就是持久化文件会变的越来越大。如我们调用incr 命令100次,AOF文件则保存了全部的100条,其实99条都是多余的。为了压缩AOF的持久化文件Redis提供了AOF重写机制。用来在一定程度上减小AOF文件的体积。

4.2触发重写方式

  • 在客户端模式下,执行BGREWRITEAOF命令,不会阻塞redis的服务
  • 服务器配置方式自动触发,如下可以设置percentage 的值控制自动触发的时机

4.3重写的原理

注意:重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,替换原有的文件这点和快照有点类似。

  1. redis调用fork ,现在有父子两个进程,子进程根据内存中的数据库快照,往一个临时文件中写入重建数据库状态的命令
  2. 父进程继续处理client请求,除了把写命令写入到原来的aof文件中。同时把收到的写命令缓存起来。这样就能保证如果子进程重写失败的话并不会出问题。
  3. 当子进程把快照内容写入已命令方式写到临时文件中后,子进程发信号通知父进程。然后父进程把缓存的写命令也写入到临时文件
  4. 现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。
     

总结

两种持久化方案既可以同时使用(aof),又可以单独使用,在某种情况下也可以都不使用,具体使用那种持久化方案取决于用户的数据和应用决定。

无论使用AOF还是快照机制持久化,将数据持久化到硬盘都是有必要的,除了持久化外,用户还应该对持久化的文件进行备份(最好备份在多个不同地方)。
 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一些关于 Redis 持久的可能面试问题: 1. Redis持久有哪些方式? Redis持久有两种方式,一种是 RDB 持久,一种是 AOF 持久。 2. RDB 持久和 AOF 持久有什么区别? RDB 持久是将 Redis 在内存中的数据快照保存到磁盘上,而 AOF 持久则是将 Redis 执行的每条写命令记录到磁盘上。RDB 持久可以节约磁盘空间,但可能会丢失最近的一些数据,而 AOF 持久可以保证数据不会丢失,但可能会占用更多的磁盘空间和写入时间。 3. Redis持久机制是如何保证数据一致性的? Redis持久机制可以通过在每次写操作后立即同步到磁盘,或者设置定期同步时间来保证数据一致性。 4. Redis持久可以在运行时进行吗? 可以,Redis持久可以在运行时进行配置和切换,例如可以在运行时从 RDB 切换到 AOF 持久,或者从 AOF 切换到 RDB 持久。 5. Redis持久会对性能产生影响吗? 会,Redis持久会增加磁盘 I/O 开销,可能会对写入性能产生一定的影响,但可以通过合理的配置来平衡性能和数据一致性。 6. Redis持久可以与 Redis 集群一起使用吗? 可以,Redis持久可以与 Redis 集群一起使用,但需要注意配置文件的设置和数据同步的策略。 总之,Redis持久是保证数据一致性和可靠性的重要手段,需要根据具体的业务需求和性能要求来选择合适的持久方式,并进行合理的配置和优。在面试中,还需要了解 Redis 持久的原理、机制、优缺点、与集群的结合等方面的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值