Redis的持久化

Redis作为数据库及缓存的特点

  • 缓存:数据可以丢失,速度很快。
  • 数据库:数据不可以丢失,在速度的基础上需要持久性,因为内存的数据掉电易失。

单机持久化

 

快照/副本

RDB

时点性:redis从八点钟开始持久化,过程持续了几十秒(假设八点十分完成),此时,磁盘里面的数据时八点的状态、八点十分的状态的数据还是八点到八点十分变化的状态?

通过创建子进程实现,某一时刻fork出子进程后,子进程有所有父进程的数据指针,之后发生的修改对子进程不可见(发生写时复制)。

两种触发方式:

  1. 手动触发:save命令(阻塞),关机维护时可以用。bgsave命令,后台同步(fork子进程)
  2. 配置文件中给出bgsave的规则。

优点:

  1. 恢复的速度相对快。

弊端:

  1. 不支持拉链,即只有一个dump.rdb文件,每天需要运维更新文件(每天一个文件)。
  2. 丢失数据相对多,不会实时更新数据。
  • 如果保存八点钟的状态如何实现?
  1. 阻塞
    • 从持久化开始的瞬间,redis不对外提供服务,这时将键值对写入到磁盘中,不建议使用。
  2. 非阻塞
    • 此时需要继续对外提供服务,并且将数据持久化。

如果一个进程既要满足持久化,又要提供修改,成本会很高,很难保证数据时哪个时点的,造成时点混乱。

AOF

redis的写操作记录到文件中,redis中,RDB和AOF可以同时开启,如果开启了AOF只会用AOF恢复数据。

4.0以后AOF中包含RDB全量,增加记录新的写操作。

优点:

  1. 丢失数据少

弊端:

  1. 体量无限变大,恢复速度慢。

补充

  • 父子进程

使用Linux系统是,有父子进程的概念。比如使用管道命令的同时,会出发创建子进程。

创建子进程时不会复制数据,只有在父进程修改数据时才会定向修改数据(Copy on write-写时复制)。使得创建进程变快了,而且根据经验,不可能所有数据都会被修改,也就是写时复制发生的可能性不大。

日志

posted @ 2021-04-18 12:44  January01  阅读(80)  评论(0)    收藏  举报