Redis是如何实现持久化的?

97 阅读3分钟

redis是一个基于内存的非关系型数据库,在使用缓存的时候,我们经常需要把数据写到磁盘中,或者在服务器宕机重启的时候,为保证数据不会丢失,我们需要对Resdis中的数据做持久化。 Redis实现持久化有两种方式:

  • 快照(snapshotting,RDB)

  • 只追加文件(append-only file, AOF) 官方文档地址:redis.io/topics/pers…
    RDB全称Redis Database Backup file ,也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

  • 主动备份
    这种方式需要手动输入命令进行快照,其中save方法是由Redis主进程来执行RDB,会阻塞所有的命令。还有一个命令是bgsave,Redis会fork 出一个子进程,子进程执行RDB,不会阻塞 Redis 主线程,默认选项。

  • 自动备份
    Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

RDB执行的执行的原理?
bgsave开始会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取数据并写入RDB文件。fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,会拷贝一份数据,并执行写操作

AOF 持久化与快照持久化相比,AOF 持久化的实时性更好。默认情况下 Redis 没有开启 AOF(append only file)方式的持久化(Redis 6.0 之后已经默认是开启了),可以通过 修改redis.conf配置文件来开启AOF。

AOF的命令记录的频率也可以通过redis,conf文件来配置:

AOF持久化方式有三种:

  1. appendfsync always:主线程调用 write 执行写操作后,后台线程( aof_fsync 线程)立即会调用 fsync 函数同步 AOF 文件(刷盘),fsync 完成后线程返回,这样会严重降低 Redis 的性能(write + fsync)。
  2. appendfsync everysec:主线程调用 write 执行写操作后立即返回,由后台线程( aof_fsync 线程)每秒钟调用 fsync 函数(系统调用)同步一次 AOF 文件(write+fsync,fsync间隔为 1 秒)
  3. appendfsync no:主线程调用 write 执行写操作后立即返回,让操作系统决定何时进行同步,Linux 下一般为 30 秒一次(write但不fsync,fsync 的时机由操作系统决定)。

因为AOF是记录命令,AOF文件会比RDB文件大得多,而且AOF会记录对同一个key多次的写操作,但是只有最后一次的写操作才有意义,通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同的效果。

Redis也会再触发阈值时去自动重写AOF文件。阈值也可以再redis,conf中配置:

总结:

redis做为缓存,数据的持久化是怎么做的? 在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF 这两种持久化方式有什么区别呢? RDB是一个快照文件,它是把redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据。 AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据 这两种方式,哪种恢复数据的比较快呢 RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令