开始前,先了解Redis的两个特性:
1.单线程;
2.内存数据库;
Redis开机流程:
Redis开机 -> 加载持久化文件(第一次开启的时候没有) -> 启动 -> 写入数据 -> 某一时刻把内存数据写入磁盘(生成持久化文件)
Redis支持两种形式持久化:RDB、AOF,下面逐一介绍:
RDB:
Redis会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,这个子进程的所有数据都和原进程一模一样(相当于重新复制了一个Redis进程),先将数据写入到一个临时文件,待持久化结束,再用这个临时文件替换上次持久化好的文件,整个过程中,主进程不进行任何io操作,这就确保了极高的性能;
RDB持久化文件名为:dump.rdb,这个文件的位置,是根据Redis配置文件:redis.conf 中配置项:dir 的值来确定,dir 的值默认为 ./ ,意为redis在哪里启动,就在哪里生成或加载 dump.rdb,所以生产环境,dir 的值一般都写死,防止生成和加载路径不一致问题;
dump.rdb 什么时候生成呢?或者是什么时候触发持久化呢?
1.shutdown 正常关闭redis时,如果没有开启AOF,会触发;
2.Redis配置文件:redis.conf 中,有如下三个配置项:
分别表示:900秒内有1个更改、300秒内有100个更改、60秒内有10000个更改,满足其中一种,就会触发;(可能会丢失数据)
3.执行save命令或bgsave命令,save命令使用主进程持久化,会阻塞(redis单线程),bgsave命令是单独创建(fork)子进程持久化,不会阻塞;
AOF:
将Redis的操作日志(所有写命令)以追加的方式写入文件,读操作是不记录的,不会fork子进程,在主进程中完成,下一次开机时,把aof文件中所有命令全部执行一遍;
AOF持久化文件名为:appendonly.aof,位置和RDB文件位置相同;
AOF持久化触发机制是什么样的?
如果开启了AOF持久化,Redis会创建一个缓冲区,所有写操作如下:
redis.conf 中配置项:appendonly:
no:默认值,关闭AOF
yes:开启AOF
redis.conf 中配置项:appendfsync:
no:只有在缓冲区满了以后,才会持久化到磁盘(效率快,持久化没保障)
everysec:默认值,每秒持久化一次(可能丢失一秒内数据)
always:只要缓冲区有数据,立即同步到磁盘(效率慢,安全)
由于aof文件体积会越来越大,于是有了aof重写机制:
基于内存中两个反向操作可以相互抵消不做记录,比如:set k1 v1 和 del k1 ;对于这,不做任何记录,生成新的aof文件,替换原来的aof文件,aof重写会fork子进程;
redis.conf 中配置项:aof-use-rdb-preamble:yes,开启混合持久化
混合持久化相当于重写的优化,以rdb格式保存数据,更能节约空间;
什么时候触发重写:
由于重写会fork子进程,所以要尽量不触发,推荐设置5GB;