前言
Redis是一种K-V数据库,它的数据也可以进行持久化操作。因为redis的数据都保存在内存中,如果不进行及时的持久化,可能就会因为重启导致数据的丢失。这时候就需要对redis进行持久化操作,将数据保存在磁盘上。
redis提供了两种持久化方式,分别是AOF和RDB。下面分别对这里持久化方式进行解析。
1.RDB
RDB是将redis 的数据生成快照保存在磁盘上。
RDB有多种实现方式,分别如下:
- 执行save或bgsave命令。save命令会阻塞redis,此时不会响应客户端发送的请求直到RDB文件执行完成,所以一般不推荐使用。bgsave会创建子进程,由子进程完成数据快照,不会阻塞父进程。
- 根据配置文件的save m n规则进行快照。
- 主从复制时,从库全量复制同步主库数据,此时主库会执行bgsave命令进行快照;
- 客户端执行数据库清空命令FLUSHALL时候,触发快照;
- 客户端执行shutdown关闭redis时,触发快照;
bgsave命令的工作流程如下:
-
执行bgsave命令,redis父进程判断当前是否存在子进程如AOF\RDB子进程,如果存在说明正在备份,直接返回。
-
父进程进行fork创建子进程,此时redis父线程被阻塞。
-
子进程创建完成,bgsave返回“* Background saving started by pid xxx”信息,并不再阻塞父进程,可以继续响应其他命令。
-
子进程进程创建RDB文件,根据内存生成临时快照文件,完成后对原有文件进行原子替换。
-
进程发送信号给父进程表示完成,父进程更新统计信息。
save m n规则
save m n规则表示每隔m秒,redis中有n个键改变则自动触发bgsave,在redis.conf文件中可以进行配置,并且可以组合使用。
RDB持久化配置:
save m n
#配置快照(rdb)促发规则,格式:save <seconds> <changes>
#save 900 1 900秒内至少有1个key被改变则做一次快照
#save 300 10 300秒内至少有300个key被改变则做一次快照
#save 60 10