redis持久化
redis持久化策略以及对比
持久化
- 快照 RDB(Redis DataBase):数据完整的生成一个快照,以二进制的格式保存在硬盘上,后缀为.rdb
- 写日志 AOF(Append only file):所有数据更新语句都记录在日志上(AOF重写)
1.快照:对数据在某时某点的完整备份
基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
将数据完整的生成一个快照,以二进制的格式保存在硬盘上,后缀为.rdb。当需要进行恢复时,再从硬盘加载到内存中
三种触发机制:
1:save命令触发方式(同步):新生成的一个新的临时文件,当save执行完后,用新的替换老的
2:bgsave命令触发方式(异步):与同步相同
3:规则自动触发方式:当某些条件达到时,自动生成rdb文件
2.写日志(aof)将数据更新语句都记录在日志里;
以追加非方式记录redis操作日志的文件,可以最大程度的保证数据库的安全,类似于mysql的binlog
三种触发条件:
1:always:让缓冲区的数据及时刷新到硬盘中
2:everysec:每秒刷新到硬盘,在高写入量下,可以保护硬盘,出现故障可能会丢掉一秒的数据
3:no:不可控,在不知道啥时候刷新,也不知道丢多少数据
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功 能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。 redis提供两种方式进行持久化,一种是RDB持久化,另外一种是AOF持久化。
1.RDB持久化
#原理:
RDB持久化是指在指定的时间间隔内将通过save命令将内存中的数据生成生成RDB快照文件
RDB文件是经过压缩的二进制文件,这个文件被保存在硬盘中,redis可以通过这个文件还原数据库当时的状态。
#过程:
Redis调用fork(),产生一个子进程。子进程把数据写到一个临时的RDB文件。当子进程写完新的RDB文件后,把旧 的RDB文件替换掉
#优点:
RDB文件是一个很简洁的单文件,它保存了某个时间点的Redis数据,很适合用于做备份。你可以设定一个时间点对 RDB文件进行归档,这样就能在需要的时候很轻易的把数据恢复到不同的版本。比起AOF,在数据量比较大的情况下, RDB的启动速度更快。
#缺点 :
RDB容易造成数据的丢失。假设每5分钟保存一次快照,如果Redis因为某些原因不能正常工作,那么从上次产生快照 到Redis出现问题这段时间的数据就会丢失了。RDB使用fork()产生子进程进行数据的持久化,如果数据比较大的话 可能就会花费点时间,造成Redis停止服务几毫秒。如果数据量很大且CPU性能不是很好的时候,停止服务的时间甚 至 会到1秒。
2.AOF持久化
#原理:
AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,生成AOF文件,重启Redis 时,AOF里的命令会被重新执行一次,重建数据。
#过程:
Redis调用fork(),产生一个子进程。子进程把新的AOF写到一个临时文件里。主进程持续把新的变动写到内存里的 buffer,同时也会把这些新的变动写到旧的AOF里,这样即使重写失败也能保证数据的安全。当子进程完成文件 的 重写后,主进程会获得一个信号,然后把内存里的buffer追加到子进程生成的那个新AOF里
#优点:
比RDB可靠。你可以制定不同的fsync策略:不进行fsync、每秒fsync一次和每次查询进行fsync。默认是每秒 fsync一次。这意味着你最多丢失一秒钟的数据。
#缺点:
在相同的数据集下,AOF文件的大小一般会比RDB文件大。 日志重写:新文件上会写入能重建当前数据集的最小操作命令的集合。
rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能
aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog
程序的道路上一去不复返