Redis 持久化-RDB方式
RDB方式
RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件是Redis会自动将内存的所有数据生成一份副本并存储在硬盘上,这个过程称为快照
Redis会在一下几种情况对数据进行快照:
1、根据配置规则进行数据快照
2、用户执行save或bgsave命令
3、执行flushall命令
4、执行复制(replication)时
根据配置规则进行数据自动快照
进行快照的条件,可以有用户在配置文件中自定义,有两个参数构成: 时间窗口M和改动的键的个数N, 每当时间M内被更改的键的个数大于N时,即符合自动快照条件。如Redis安装目录包含的样例配置文件的预置3个条件:
save 900 1
save 300 10
save 60 10000
每条快照占一行,并以save参数开头。同时可以存在多个条件,条件之间是"或"的关系,就例子而言,save 900 1 的意思是在15分钟(900秒)内有一个或一个以上的键被更改则进行快照。同理save 300 10 表示在300秒内至少有10个键被修改则进行快照。
用户执行save或bgsave命令
1、save命令
当执行save命令时,Redis同步的进行快照,在快照过程中会阻断所有来自客户端的请求。当数据比较多时,这一过程会导致Redis会有较长时间无响应,尽量避免在生产环境使用这一命令。
2、bgsave命令
手动执行快照是推荐使用bgsave命令,bgsave命令可在后台异步的进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。执行bgsave后Redis会立即返回ok表示开始执行快照, 如果想知道快照是否完成,可以通过lastsave命令来获取最近一次成功执行快照的时间,返回的结果是一个时间戳。
执行flushall命令
当执行flushall命令,Redis会清除数据库中所有的数据,需要注意的是, 不论清空数据库的过程是否触发了自动快照条件,只要自动快照条件不为空,Redis就会执行一次快照操作。当没有自定义快照条件时, 执行flushall则不会进行快照
执行复制(replication)时
当设置了主从模式,Redis会在复制初始化时进行自动快照,即使没有定义自动快照条件,且没有手动执行快照条件,也会生成RDB快照文件。
RDB快照原理
Redis默认会将快照文件存储在Redis当前进程的工作目录中的dump.db文件中,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。
RDB快照过程
1、Redis使用fork函数复制一份当前进程(父进程)的副本(子进程):
2、父进程继续接受和处理客户端发来的命令,而子进程开始将内存的数据写入到硬盘的临时文件中
3、当子进程写完所有数据后会用该临时文件替换旧的RDB文件,至此一次快照操作完成。
执行fork时操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改某片数据,操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的时fork一刻的内存数据。
Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存,根据数据量的大小和结构和服务器的性能不同, 时间也不同。
通过RDB持久化,一旦Redis异常退出,就会丢失Redis最后一次快照以后更改的数据。这就需要根据具体的应用场景, 将可能发生的数据损失控制在能接受的范围内。