什么是Redis持久化?
redis如果将数据保存在内存中,机器宕机重启,数据会丢失,如果我们把数据保存在磁盘中,如果机器宕机重启后,数据不会丢失,这就是持久化的过程。
Redis持久化有两种方式:
- RDB方式
- AOF方式
什么是RDB方式?
RDB通过快照方式完成,当符合一定条件时,Redis会自动将内存中的数据进行快照并存储在磁盘中。进行快照的条件在配置文件中指定,有两个参数构成:时间和改动的键的个数。当在指定时间内被改动的键的个数大于指定的键的个数时,redis就会自动进行快照。
RDB是redis默认的持久化方式。
默认的RDB的文件路径是当前目录,文件名是:dump.rdb。可以在配置文件中修改。
RDB的快照过程:
redis使用fork()函数复制一份当前进程(主进程)的副本(子进程);
父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入到硬盘中的临时文件。
当子进程写完之后,会用该临时文件覆盖旧的rdb文件。
RDB文件是通过压缩的,可以通过配置rdbcompression参数来禁用压缩。
压缩与不压缩的优缺点:
压缩会减少磁盘存储的空间,但会消耗cpu
不压缩会消耗磁盘存储空间,但会节约cpu
可以用个SAVE和BGSAVE来手动快照,两个命令的区别是前者是由主进程执行快照,会阻塞其他请求,后者会创建一个fork进程来执行快照操作。
注意:由于redis使用fork来复制一份当前的进程,那么子进程会占用与父进程一样的资源,从而导致性能会降低。
什么是AOF方式?
RedisAOF持久化策略是将发送到redis服务器的每一条命令都记录下来,并且保存到硬盘中的AOF文件中,AOF文件和RDB文件的位置相同,都是通过dir参数设置,默认的文件名是appendonly.aof,可以通过appendfilename参数修改。
redis中默认不开启aof。并且appendonly.aof不会记录get命令,因为没有意义。
可以通过BGREWRITEAOF命令来重写aof文件。
重写的目的:去除中间命令,释放空间。
文件的写入默认情况下会先写入到缓存中,系统每30秒同步一次,才会真正的写入到磁盘中,那么如果在这30秒服务器宕机,那么数据也会丢失,所以redis可以通过配置来修改同步策略。
最后注意点:在恢复数据时,如果同时有appendonly.aof和dump.rdb,那么会用appendonly.aof来恢复数据。