吃透redis持久化,妈妈再也不担心我面试过不了

 

 

持久化介绍

redis 提供了两种方式方式进行数据的持久化(将数据存储到硬盘中);第一种称为快照(snapshotting)RDB,它将某一时刻的所有数据都写入硬盘,所以快照是一次全量备份,并且存储的数据形式是二进制序列化形式;另一种方式是只追加文件(append-only file)AOF, 它会在执行命令时将命令复制一份到硬盘中,AOF在长期运行中会变的非常庞大,数据库重启加载AOF日志将会很慢;

redis 将数据持久化的主要原因就是重用数据,或者防止系统故障,备份数据;

两种方式的持久化是可以同时存在的,但是当Redis重启时,AOF文件会被优先用于重建数据

工作原理

快照工作原理

redis的快照必须要求文件IO操作,单线程的redis进行多余的IO操作会影响服务器的性能,所以redis采用COW(copy on write)机制实现快照的持久化;

  • 首先redis进行会fork一个的进程,此时就存在父子进程;
  • 父进程负责进行修改操作,内存持续增加;而子进程数据不做任何变化;
  • 子进程将瞬间数据写入磁盘的rdb文件

 

AOF工作原理

AOF日志存放了redis指令顺序序列;所以只要重新执行AOF文件包含所有的命令就可以实现AOF文件记录的所有数据;

常用配置

RDB配置

默认文件

dbfilename dump.rdb
dir ./

redis会将数据默认dump至dump.rdb文件中;我们可以通过配置修改dump的频率;

在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。

save 900 1

在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。

save 300 10

在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照

save 60 10000

如果想要禁用快照功能,注释掉如上配置,开启save ""配置

save ""

save 900 1

save 300 10

save 60 10000

手动备份

save命令是阻塞命令 ,当服务器接收到save命令之后就会开始拍摄快照,在此期间不会处理其他请求;

bgsave命令也是立即拍摄快照,非阻塞命令,而是fork一个子线程进行备份快照;

缺点

  • 每隔一段时间进行一次持久化,如果redis崩溃,可能会导致部分数据丢失问题;
  • RDB使用fork()的进程进行数据的持久化,如果数据量大,可能花费的时间较长,redis会造成明显的卡顿几秒现象;
  • 很好的备份效果,容易进行数据恢复;

优点

  • 相比AOF,在数据量比较大的情况下,RDB的启动速度更快;
  • RDB使用fork()子进程进行数据的持久化,本身不会有多余的IO操作;

 

AOF配置

启用AOF

appendonly yes

默认文件

appendfilename "appendonly.aof"
dir ./

fsync

如果redis发生宕机事件,有可能没来得及数据写入磁盘;此时redis AOF 的 fsync 策略能够保证redis保持高性能,和尽可能的减少数据丢失;默认就是使用 1s执行一次同步;

每次有数据修改发生时都会写入AOF文件。

appendfsync always

每秒钟同步一次,该策略为AOF的缺省策略。

appendfsync everysec

从不同步。高效但是数据不会被持久化。

appendfsync no

AOF重写

AOF日志文件会随着redis运行越来越庞大,Redis 提供了 bgrewriteaof 指令用于对 AOF 日志进行瘦身;也可以使用配置文件进行自动瘦身;

当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。

auto-aof-rewrite-percentage 100

当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。

auto-aof-rewrite-min-size 64mb

要禁用自动的日志重写功能,我们可以把百分比设置为0

auto-aof-rewrite-percentage 0

优点

  • 使用fsync每秒一次同步,数据完整性较高;
  • redis如果发生宕机,支持使用redis-check-aof 工具修复损坏的AOF文件

缺点

  • AOF文件的大小一般会比RDB文件大
  • AOF在运行效率上往往会慢于RDB
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值