因为redis是基于
内存的数据库,所以为了防止由于
系统崩溃导致数据丢失的问题,使用了存储在
硬盘上的数据持久性两种不同的
方法,一个方法(RDB)是所有数据的快照,它可以在某个时刻
发现写入
磁盘在里面,另一种方法是只有一个额外的
文件(AOF),它将在写
命令的
执行,写命令执行写入硬盘。
快照的持久性
Redis可以
创建一个快照时间点上得到一份在存储器中的数据。在创建快照,
用户可以备份快照,快照
复制到其他
服务器,创建具有相同的数据服务器的副本,并留下快照的地方
重启服务器。
有两个命令可以用来生成数据库文件,一个是
保存,和其他bgsave。
当我们仅使用快照持久性来保存数据时,如果系统真的崩溃,用户将丢失在最新快照之后更改的所有数据。因此,快照持久性只适用于不造成问题的
应用程序,即使部分数据丢失。
保存
特点:保存命令块的redis服务器
进程直到创建RDB文件和服务器无法
处理任何命令请求服务器进程阻塞在。
缺点:在服务器持久性期间不能接受其他请求。
bgsave
特点:该bgsave命令将得到一个子进程,然后通过子进程负责创建RDB文件服务器进程来处理请求的命令。
缺点:用于创建一个孩子的过程时间会占用的内存增加redis。
AOF持久化
AOF持久化将执行的命令的AOF文件结束记录数据的变化。因此,Redis可以
恢复从开始到结束在AOF文件包含所有的书面命令,使数据集多种文件记录可以恢复。
当
设置同步频率时,有三个
选项:
选项
同步频率
总是
每一个redis写命令应该被写入硬盘的同步,但这会占用的内存使用,严重降低了Redis
速度。
everysec
同步每秒,将多个写命令同步显式地复制到硬盘上。
不
让
操作系统决定何时进行同步
最好使用everysec,可避免书写
性能造成的
影响,每一次,可以避免
操作系统崩溃可能导致数据丢失,即使系统崩溃,大多数用户只会失去一次数据,当硬盘忙于执行写操作时,Redis会缓慢优雅为了适应最大速度的硬盘写入速度。
缺点:由于Redis会
连续记录执行的命令以多种文件,以便使用继续执行,AOF文件的数量也会增加。在极端的
条件下,多种可能用完所有可用
空间的硬盘。
为了
解决以上的不足,提供了bgrewriteaof Redis命令,这将消除在AOF文件冗余命令重写AOF文件,使得AOF文件尽可能的小,bgsave命令类似的原则,Redis创建一个子进程,然后子进程负责重写AOF文件,因为AOF文件重写也需要使用子过程,所以也有持续性由于快照创建一个子进程造成的性能和内存占用问题。