Redis --- 持久化
一、Redis持久化
Redis有两种持久化方案:
1. RDB持久化
2. AOF持久化
1.1、RDB持久化
RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。
1.1.1、执行时机
RDB持久化在四种情况下会执行:
- 执行save命令
- 执行bgsave命令
- Redis停机时
- 触发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的基本流程?
- fork主进程得到一个子进程,共享内存空间
- 子进程读取内存数据并写入一个临时 RDB 文件中
- 当子进程完成对新 RDB 文件的写入时,Redis用新RDB文件替换旧的RDB文件
RDB会在什么时候执行?save 60 1000代表什么含义?
- 默认是服务停止时
- 代表60秒内至少执行1000次修改则触发RDB
RDB的缺点?
- RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险
- 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
三种策略对比
- 每次有新命令追加到 AOF 文件时就执行一次 fsync :非常慢,也非常安全。
- 每秒 fsync 一次:足够快(和使用 RDB持久化差不多),并且在故障时只会丢失 1 秒钟的数据。
- 从不 fsync :将数据交给操作系统来处理。更快,也更不安全的选择。
推荐(并且也是默认)的措施为每秒 fsync 一次, 这种 fsync 策略可以兼顾速度和安全性。
1.3 AOF 的运作方式
AOF 重写和 RDB 创建快照一样,都巧妙地利用了写时复制机制。
以下是 AOF 重写的执行步骤:
- Redis 执行 fork() ,现在同时拥有父进程和子进程。
- 子进程开始将新 AOF 文件的内容写入到临时文件。
- 对于所有新执行的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加到现有 AOF 文件的末尾,这样即使在重写的中途发生停机,现有的 AOF 文件也还是安全的。
- 当子进程完成重写工作时,它给父进程发送一个信号,父进程在接收到信号之后,将内存缓存中的所有数据追加到新 AOF 文件的末尾。
- 搞定!现在 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采用的是定期删除+惰性删除策略。