redis持久化
redis是c语言编写的,5.0之前是单线程,高性能的(key/value)内存数据库,基于内存运行并支持持久化的nosql数据库。
redis提供两种方式进行持久化,一种是RDB持久化(默认),另外一种是AOF(append only file)。
1、RDB
原理:redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个进程的所有数据(变量、环境变量,程序计数器)都和原进程一模一样,会先将数据写到一个临时文件中,待持久化结束了,再将这个持久化文件替换上次持久化好的文件,整个过程,主进程不进行io操作,这就确保了极高的性能。(基于内存数据=》生成持久化文件)
持久化文件:默认哪里启动就到哪里生成(或读取)RDB持久化文件,一般需要把读取位置写死。(修改redis.conf中dir,dir是整个redis工作空间位置)
触发RDB机制:shutdouwn时,如果没有开启AOF,会触发;配置文件中默认的快照配置(定时);执行bgsave或save,save使用主进程持久化,全部阻塞(不使用)。bgsave会在后台异步进行快照操作,同时响应客户端请求;执行flushall命令。
2、AOF
原理:将redis的操作日志以追加的方式写入文件,读操作是不记录的。
持久化文件和RDB一样
开启AOF持久化(redis.conf中appendonly no改为appendonly yes)
appendfsync always 同步持久化,每次发生数据变更时,立即记录到磁盘(效率低,安全)
appendfsync everysec(默认)每秒同步一次(快,但可能会丢失一秒内的数据)
appendfsync no 表示操作系统进行数据缓存到磁盘(效率快,持久化没保证)
重写(frok子进程完成-复制redis),执行的命令bgrewriteaof
auto-aof-rewrite-percentage 100 AOF文件大小增长率大于该配置项时自动开启重写
auto-aof-rewrite-min-size 64mb AOF文件大小大于该配置项时自动开启重写
注:redis4.0版本后混合持久化(RDB+AOF),aof-use-rdb-preamble yes(默认),frok子进程先将共享的内存副本全量以RDB方式写入AOF文件,然后再将重写缓冲区的增量命令以AOF方式写入文件,写入完成后通知统计信息,替换旧的AOF文件。
总结:RDB适合数据恢复 数据丢失大;AOF保证数据安全 恢复数据慢