Redis的持久化
Redis作为数据库及缓存的特点
- 缓存:数据可以丢失,速度很快。
- 数据库:数据不可以丢失,在速度的基础上需要持久性,因为内存的数据掉电易失。
单机持久化
快照/副本
RDB
时点性:redis从八点钟开始持久化,过程持续了几十秒(假设八点十分完成),此时,磁盘里面的数据时八点的状态、八点十分的状态的数据还是八点到八点十分变化的状态?
通过创建子进程实现,某一时刻fork出子进程后,子进程有所有父进程的数据指针,之后发生的修改对子进程不可见(发生写时复制)。
两种触发方式:
- 手动触发:save命令(阻塞),关机维护时可以用。bgsave命令,后台同步(fork子进程)
- 配置文件中给出bgsave的规则。
优点:
- 恢复的速度相对快。
弊端:
- 不支持拉链,即只有一个dump.rdb文件,每天需要运维更新文件(每天一个文件)。
- 丢失数据相对多,不会实时更新数据。
- 如果保存八点钟的状态如何实现?
- 阻塞
- 从持久化开始的瞬间,redis不对外提供服务,这时将键值对写入到磁盘中,不建议使用。
- 非阻塞
- 此时需要继续对外提供服务,并且将数据持久化。
如果一个进程既要满足持久化,又要提供修改,成本会很高,很难保证数据时哪个时点的,造成时点混乱。
AOF
redis的写操作记录到文件中,redis中,RDB和AOF可以同时开启,如果开启了AOF只会用AOF恢复数据。
4.0以后AOF中包含RDB全量,增加记录新的写操作。
优点:
- 丢失数据少
弊端:
- 体量无限变大,恢复速度慢。
补充
- 父子进程
使用Linux系统是,有父子进程的概念。比如使用管道命令的同时,会出发创建子进程。
创建子进程时不会复制数据,只有在父进程修改数据时才会定向修改数据(Copy on write-写时复制)。使得创建进程变快了,而且根据经验,不可能所有数据都会被修改,也就是写时复制发生的可能性不大。

浙公网安备 33010602011771号