【Redis --- 持久化】

Redis提供RDB和AOF两种持久化方式,RDB通过快照实现,AOF记录命令日志。RDB适合全量恢复但可能丢失部分数据,AOF更安全但文件体积大。Redis的缓存删除策略结合了定期删除和惰性删除,保证效率和数据准确性。
摘要由CSDN通过智能技术生成

一、Redis持久化

Redis有两种持久化方案:

 1. RDB持久化 
 2. AOF持久化

1.1、RDB持久化

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。

1.1.1、执行时机
RDB持久化在四种情况下会执行:

  1. 执行save命令
  2. 执行bgsave命令
  3. Redis停机时
  4. 触发RDB条件时

1、save命令

执行下面的命令,可以立即执行一次RDB:
在这里插入图片描述
save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

2、bgsave命令
下面的命令可以异步执行RDB:
在这里插入图片描述
这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。

3、停机时

Redis停机时会执行一次save命令,实现RDB持久化。

4、触发RDB条件

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

# 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDB
save 900 1  
save 300 10  
save 60 10000 

1.1.2、RDB原理
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则需要修改某块数据,那么这块数据就会被复制一份到内存,生成该数据的副本,主进程在该副本上进行修改操作。与子进程两者不会相互影响,子进程备份的还是执行持久化操作前的数据,待子进程持久化完成后,新的写操作才会和原来的进行合并,待下次持久化时,才会把新的写入操作写入。
    在这里插入图片描述

小结

RDB方式bgsave的基本流程?

  1. fork主进程得到一个子进程,共享内存空间
  2. 子进程读取内存数据并写入一个临时 RDB 文件中
  3. 当子进程完成对新 RDB 文件的写入时,Redis用新RDB文件替换旧的RDB文件

RDB会在什么时候执行?save 60 1000代表什么含义?

  1. 默认是服务停止时
  2. 代表60秒内至少执行1000次修改则触发RDB

RDB的缺点?

  1. RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
  2. fork子进程、压缩、写出RDB文件都比较耗时

1.2、AOF持久化

1.2.1、AOF原理
AOF全称为Append Only File(追加文件)。通过保存服务器执行的命令来记录状态的。还原的时候再执行一遍即可
在这里插入图片描述
1.2.2、AOF配置
AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

# 是否开启AOF功能,默认是no
appendonly yes
# AOF文件的名称
appendfilename "appendonly.aof"

AOF的命令记录的频率也是可以通过修改redis.conf配置文件来配置的
1.表示每次执行写操作立即记录到磁盘中的AOF文件中

appendfsync always

2.写命令执行完先放到AOF缓存区,然后每隔1秒将缓存区中数据写入到磁盘中的AOF文件中

appendfsync everysec

3.写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘中的AOF文件

appendfsync no

三种策略对比

  1. 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
  2. 每秒 fsync 一次:足够快(和使用 RDB持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
  3. 从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。

推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。

1.3 AOF 的运作方式

AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制。

以下是 AOF 重写的执行步骤:
在这里插入图片描述

  1. Redis 执行 fork() ,现在同时拥有父进程和子进程。
  2. 子进程开始将新 AOF 文件的内容写入到临时文件。
  3. 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾,这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
  4. 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
  5. 搞定!现在 Redis 原子地用新文件替换旧文件,之后所有命令都会直接追加到新 AOF 文件的末尾。

1.4、RDB与AOF对比
RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用

1.5 、AOF文件重写
因为AOF是记录命令的,所以AOF文件要比RDB文件大的多,而且AOF会记录对同一个key的多次写操作,但是,只有最后一次写操作才是有意义的,之前的写操作数据被覆盖了。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同的效果,从而来减少AOF文件体积大大小。
在这里插入图片描述
什么时候执行aof文件重写?
Redis也会在触发阀值的时候自动重写AOF文件的。阀值也可以在redis.conf文件中配置。配置如下:

在这里插入图片描述

Redis缓存删除策略

Redis缓存删除策略通常涉及到以下几种方式:

  • 定时删除:为每个key设置一个过期时间,当过期时间达到时,自动删除key。

  • 惰性删除:key过期时,不立即删除,而是在访问key时检查是否过期,过期则删除。

  • 定期删除:每隔一定时间,随机抽查一些key,删除其中已过期的key

redis采用的是定期删除+惰性删除策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dnfdsaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值