第13课:Redis持久化与原理解析

Redis的持久化是指把内存中的数据异步存到磁盘里,如果机器出现问题,内存数据丢失,可以从磁盘恢复数据

Redis持久化有两种模式
一种是filesnapshotting
当redis需要做持久化时,redis会fork一个子进程;子进程将数据写到磁盘上一个临时RDB文件中;当子进程完成写临时文件后,将原来的RDB替换掉,这样的好处就是可以copy-on-write
另一种是AOF(全持久化模式) 缺点:损失一部分性能 优点:不会丢失数据,保证数据完整性
filesnapshotting方法在redis异常死掉时,最近的数据会丢失(丢失数据的多少视你save策略的配置),所以这是它最大的缺点,当业务量很大时,丢失的数据是很多的。Append-only方法可以做到全部数据不丢失,但redis的性能就要差些。AOF就可以做到全程持久化,只需要在配置文件中开启(默认是no),appendonly yes开启AOF之后,redis每执行一个修改数据的命令,都会把它添加到aof文件中,当redis重启时,将会读取AOF文件进行“重放”以恢复到redis关闭前的最后时刻

AOF配置:

修改redis配置文件redis.conf
#默认情况下Redis会异步的将数据导出到磁盘上。这种模式对许多应用程序已经足够了,  
#但是如果断电或者redis进程出问题就会导致一段时间内的更新数据丢失(取决与配置项)  
#  
#这种只增文件是可选的能够提供更好的体验的数据持久化策略。  
#举个例子,如果使用默认的配置数据fsync策略,在服务器意外断电的情况下redis只会丢失一秒中内的更新数据,  
#或者当redis进程出问题但操作系统运转正常时,redis只会丢失一个数据更新操作。  
#  
#AOF 和 RDB 持久化方式可以同时启动并且无冲突。  
#如果AOF开启,启动redis时会加载aof文件,这些文件能够提供更好的保证
appendonly no

# 只增文件的文件名称。(默认是appendonly.aof)  
# appendfilename appendonly.aof  
  
#调用fsync()函数会通知操作系统真正将数据写入磁盘,而不是等待缓冲区中有更多数据。  
#有些操作系统会将数据输出到磁盘,有些操作系统只是ASAP。  
#  
#redis支持三种不同的方式:  
#  
#no:不调用,之等待操作系统来清空缓冲区当操作系统要输出数据时。很快。  
# always: 每次更新数据都写入仅增日志文件。慢,但是最安全。  
# everysec: 每秒调用一次。折中。  
#  
#默认是每秒中一次,因为它往往是在速度和数据安全两者之间的折中选择。  
#如果你可以接受让操作系统去自动清空缓存,你可以将这项配置降低到'no'(如果你可以接受一段时间的数据丢失,默认的rdb就足够了),  
#这完全取决与你。如果你想要一个更好的体验或者从相反的角度,使用'always',这样会很慢,但是比'everysec'安全些。  
#  
#请在下面的文章中获取更多细节知识:  
#  http://antirez.com/post/redis-persistence-demystified.html  
#  
#如果你不是很清楚这三项之间的区别,或者不知道哪种适合你的机器,就是用默认吧。  
  
# appendfsync always  
appendfsync always  
# appendfsync no  
  
#当AOF策略设置为'always'或者'everysec'的时候,后台的保存进程会进行很多磁盘I/O操作,  
#在某些linux结构中redis会在调用sync()方法时阻塞很长时间。记住,现在还没办法解决这个问题,即使在不同进程中进行调用也会block。  
#  
#使用如下配置可能会缓解这个问题,这样会在存储大数据或者BIGREWRITEAOF的时候不会在主进程中调用fsync()方法。  
#  
# 这表示,如果另外一个子进程在进行保存操作,redis的表现如同配置为‘appendfsync no’。  
#在实际应用中,这表示在最坏的情景下(使用linux默认配置)可能会丢失30秒日志。  
#   
#如果你有特殊的情况可以配置为'yes'。但是配置为'no'是最为安全的选择。  
no-appendfsync-on-rewrite no  
  
  
#自动重写只增文件。  
#redis可以自动盲从的调用‘BGREWRITEAOF’来重写日志文件,如果日志文件增长了指定的百分比。  
#   
#它是这样工作的:每次rewrite后redis会记录日志文件的大小。(如果重启后没有重写后的大小,就默认用日志文件大小)  
#  
# 这个基准日志大小和当前日志大小做比较。如果当前大小比指定的百分比,重写机制就会被触发。  
#同时,你也要制定一个重写下线,用来避免增长百分比够了,但是日志文件还很小的情况。  
#  
#指定百分比为0可以注掉自动重写日志文件功能。  
  
auto-aof-rewrite-percentage 100  
auto-aof-rewrite-min-size 64mb