【redis实现数据持久化】

redis官方提供了两种持久化方式

  •  快照(snapshot),也叫做rdb持久化

  •  AOF,只追加日志文件

一、rdb方式实现持久化
在指定的时间间隔内将内存中的数据集快照写入到磁盘中,保存的文件是以rdb结尾。也就是行话讲的快照(Snapshot),当redis宕机重启时他会直接将快照文件读取进内存中,实现数据恢复。这也是redis默认开启的持久化方式。
1、rdb文件生成方式(快照生成方式)

  •  手动输入BGSAVE或者SAVE命令
  •  修改配置文件实现自动触发

 1.1、使用BGSAVE命令生成rdb文件(快照)
 在客户端输入bgsave命令,当redis收到这条命令后会调用fork创建一个子进程。这个子进程相当于父进程的副本。然后子进程会将所有数据写入到一个临时文件中,当持久化的过程结束后。就会用这个临时文件替换上一次的持久化文件(rdb文件)(这个技术称为写时复制技术)。这整个过程中,持久化全由子进程操作,而父进程继续处理其他命令。这种方式性能高,但是最后一次持久化时数据可能丢失。

1.2、使用SAVE命令生成rdb文件(快照)

他的操作与bgsave类似,但不会创建子进程,持久化操作由主进程完成。在这个过程中,其他命令会进入阻塞,当持久化完成后,redis才会处理其他命令。

BGSAVE和SAVE的比较图

26be43b57a9f4eca82f9fa624b6a1a45.png

bgsave是异步进行的

可以通过lastsave获取最后一次成功执行快照的时间

2、修改配置文件实现自动触发(redis.conf)

b240cf8a6eee491293ae0f1f29b5a6a0.png bb3c2f96fcf341a88eb42fef7477ac92.png

4dcc3cd35e0948928f95461492345493.png575c1021fdca47c5a14f830f9f260764.png

57afcd10d0af43619cc324e386167d45.png

当满足任意一个条件时,则会进行一次持久化操作。即自动执行一次bgsave命令

8353a8febc29411ab22afda5abdd9c53.png

 3、shutdown命令生成快照

当redis收到shutdown命令时,会自动执行一个save命令。阻塞所有客户端,不在执行客户端发送的命令,并在save命令执行完毕后关闭服务。

二、AOF实现持久化(默认不开启)

aof,以日志的形式记录每一个写操作,然后把这些命令追加到aof文件中。当redis重启时,他会读取aof文件,把里面记录的所有命令执行一遍,以实现数据恢复。

1、在redis.conf文件中开启aof

d7e18a14dfd3495280d080107fcdcc35.png

因为我的redis版本是7.0,所以一些默认生成的配置有些不一样,请看图:

707bc82df811497f8a424c40f7dd7cfb.png

通过注释可以知道,开启aof后。如果appendfilename的值为appendonly.aof,那么会生成三个派生文件。同时他们的会存放在appendonlydir文件夹中。这个文件夹的默认位置与redis-server文件在一起。

 2、如果rdb和aof同时开启,那么redis启动时默认读取aof文件来恢复数据

 3、aof文件修复

 如果aof文件出现损坏,此时连接redis会出现连接失败,redis服务也未能开启

24f0e1d9bb5e455a8e20bafe87437f45.png

da11a355ce16471ebafbfc3a021ea58c.png

 此时可以使用修复工具对损坏的aof文件进行修复

../redis-check-aof --fix aof文件名
../代表我的redis-check-aof所在的目录

1e5904dac2134d3cb94ef8fb754605ac.png

99078fb86264486982bc6d674336abf8.png

 391f8c169ebf4bc29f955a6aeaac2b84.png

此时redis可以正常启动并用客户端连接

4、aof同步频率设置

fa570132e6ef4082b9044514a478e33c.png

  • appendfsync always

        及时同步:客户端每进行一次写操作,那么就会redis就会把这一次操作记录到aof中。如果1000个客户端同时发送1次写操作,那么redis就会进行1000次同步。这样虽然能把损失降到最少,但这种操作由于要对硬盘进行大量的写操作,所以redis处理速度会受硬盘性能限制。

        由于这种同步频率会不断写入小数据,可能会引发严重的写入放大问题。会将硬盘的使用寿命大幅减少,特别是昂贵的固态硬盘,要谨慎使用这种同步频率。

  • appendfsync sverysec(redis默认使用的同步频率)

        每秒执行一次:如果客户端发送了1000次写入命令,那么不会像always一样来一次写一次,进行1000次同步命令到aof中。而是等到1秒后一次性把这1000个写入命令同步到aof文件中。这样不仅提高了性能,而且最多损失一秒内的数据。

  •  appendfsync no

        redis不主动进行同步,而是把同步时机交给操作系统来决定什么时候进行同步。这种同步不会对redis性能产生影响,但是系统崩溃时会丢失不定量的数据。并且如果用户硬盘写入操作不够快的话,当缓冲区等待写入硬盘的数据填满时,redis会进入阻塞状态,导致redis处理命令的速度下降。

 5、redis的aof文件过大问题解决

通过重写机制可以解决aof文件过大的问题

1、通过客户端手动进行重写,输入BGREWRITEAOF命令进行重写

2、redis.conf配置自动触发重写

05549a9621484cd5a8a31d1049bbedc2.png

auto-aof-rewrite-percentage 100: 

       100表示,文件大小必须是上次重写后文件大小的100%(也就是增加了1倍)

auto-aof-rewrite-min-size 64mb:

       64MB表示文件最小要达到64MB

同时满足以上两种条件才会触发重写:以上是redis重写的默认配置,只有当aof文件的大小是上次重写后文件大小的一倍且大于或等于64MB才会触发重写。

例如AOF文件大小为70MB,重写后大小为50MB。那么下一次重写的触发条件:50MB的两倍且大于64MB,也就是至少达到100MB才会触发重写

 6、重写的原理

        用一个新的aof文件去替换旧的aof文件

流程:

        当手动输入bgrewriteaof命令或者自动触发了这个命令时:

1:redis通过fork创建一个子进程,子进程根据当前数据库的状态生成一个快照,然后把快照中的数据以命令的方式写入到一个临时文件中

2:redis正在向临时文件中写入命令,此时父进程继续处理客户端发送过来的其他命令。此时会把这些新发送过来的写命令继续追加到旧的aof文件中,同时把这些新的写命令缓存起来

3:当子进程把所有命令写入到了临时文件中,就会通知父进程,父进程就会把他缓存的那些命令也写入到临时文件中

4、当父进程也写入完成后,就会用这个临时文件去替换旧的aof文件。那些新来的写入命令也会追加到这个新的aof文件中

319d86cd510b47e9804ba9efeacda700.png

 以上笔记是根据b站up主:编程不良人和尚硅谷综合起来做的,前者讲的更细点

 

 

 

 

 

 

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Redis提供了两种方式来实现数据持久化:RDB(Redis Database)和AOF(Append-Only File)。 1. RDB持久化: RDB是Redis的默认持久化方式,它将当前内存中的数据保存到磁盘上的一个二进制文件。RDB持久化可以在指定的时间间隔内自动执行,也可以手动执行。当执行RDB持久化时,Redis会fork一个子进程来将数据写入到磁盘上的文件中,完成后再替换原有的文件。RDB持久化适用于数据备份和恢复,以及在重启Redis时快速加载大量数据。 配置RDB的方式: 在Redis配置文件中,可以通过设置`save`指令来配置RDB持久化的触发条件和频率。例如,`save 3600 1`表示在1个小时内,如果至少有1个键被修改,则执行RDB持久化。 2. AOF持久化: AOF持久化以日志追加的方式将每个写操作命令追加到一个文件中。通过重新执行这些命令,可以将数据恢复到Redis服务器重新启动之前的状态。AOF持久化方式相对于RDB更加耐久,因为它记录了每个写操作命令,可以在服务异常终止时更好地保证数据的完整性。 配置AOF的方式: 在Redis配置文件中,可以通过设置`appendonly`指令来启用AOF持久化。默认情况下,AOF持久化是关闭的。可以设置`appendfsync`指令来控制AOF文件何时被同步到磁盘。常用的选项有`always`(每个写命令都立即同步到磁盘,最安全但性能较差)、`everysec`(每秒同步一次,折衷方案)和`no`(操作系统决定何时同步,性能最好但风险较高)。 可以根据实际需求选择适合的持久化方式,或者同时使用RDB和AOF来提高数据的安全性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值