redis强劲的性能很大程度上是因为所有的数据都存储在内存上,但是redis重启后,所有内存中的数据就会丢失.所以一般情况下持久化redis中的数据就很有必要了,重启后,redis也会从持久化的文件中加载数据.
redis的持久化有两种: RDB 和 AOF
1.RDB
RDB方式的持久化是通过快照完成的,当符合一定 条件时,redis会自动将内存中的数据生成一份副本并存储到硬盘中,这个过程就是快照.
redis会根据以下几种情况进行快照:
1)根据配置规则进行自动快照
//用户在配置文件中自定义 ,由两个参数构成,时间窗口M 和 改动的键的个数 N
save 900 1
save 300 10
save 60 10000
2)用户执行save或bgsave命令
区别在于执行save命令后会阻塞所有来自客户端的请求
bgsave命令可以在后台异步进行快照,同时服务器还可以继续响应客户端的请求
3)flushall命令
只要存在快照条件,执行flushall命令就会执行一次快照
4)复制
当设置了主从模式并进行复制时,一定会进行快照
快照原理:
快照文件默认存储在dump.rdb中,可通过配置dir和dbfilename自己定义路径和文件名
快照的过程:
1)redis使用fork函数复制一份当前进程(父进程)的副本(子进程)
2)父进程继续接受请求响应,子进程向硬盘中写入数据
3)子进程写完所有数据后会用该临时文件替换旧的rdb文件
fork时,父子进程共用一个内存资源,当父进程继续写入操作,父子进程的内存数据就有了差异,修改前的部分需要复制保存,随着写入的增加,内存占有增大
(可以设置申请超过可用内存)
redis启动后会读取rdb文件,将数据从硬盘加载到内存中
2.AOF
AOF可以将redis执行的每一条写命令追加到硬盘中.
AOF是需要开启的
appendonly yes
可以通过dir和appedfilename设置路径和文件名
默认文件名是appendonly.aof
AOF可以通过设置来进行自动优化,避免一些冗余的命令,造成AOF文件过大,redis的解决办法就是当达到一定条件时,redis就会自动重写AOF文件(将一些无用的记录删除)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
auto-aof-rewrite-percentage参数是目前的AOF文件大小超过重写时的百分之多少时就会重写
auto-aof-rewrite-min-size限制了允许重写的最小AOF文件大小
redis同步硬盘数据
每次执行对数据库的操作时,AOF就会将命令记录在AOF文件中,但是事实上,由于操作系统的缓存机制,数据是先进入的硬盘缓存,默认情况下每30秒执行一次同步操作,这样就可能会因为系统异常造成数据的丢失,可以通过appendfsync参数设置:
#apendfsync always //每次都执行
apendfsync everysec //每秒执行一次 (推荐)
#apendfsync no //不主动同步(系统默认30秒)
redis允许同时开启RDB和AOF,重新启动redis会使用AOF文件来回复数据.
参考书:redis入门指南 -- 李子骅