redis持久化机制

1、简单介绍

  redis的持久化机制是用于把内存的数据存储到硬盘上,作用是当redis服务重启时或者当系统奔溃或故障,那么redis重启可以把数据从硬盘上恢复到内存。

  redis的持久化机制有2种,第一种是快照;第二种是aof。

1)快照方式

  快照方式是指在一定时间间隔后当写命令达到了配置要求的数量,则把内存中的所有数据全部保存到文件。这里是采用的写时复制机制,首先父进程会fork一个子进程,父进程会继续接受client的读和写请求,子进程会把当前内存中的数据保存到一个临时文件中,在子进程做快照的过程中,如果有写请求,那么父进程会把写的数据放到一个缓冲区,当子进程把之前的缓存数据写好了临时文件后,子进程会告知父进程,然后子进程再把临时缓冲区就是新增的数据再写入临时rdb文件,然后rename,把临时文件替换为正式的rdb文件。

  【注意】: 快照保存的规则可以在redis的配置文件中配置,可以多配置几条策略,比如:

  save 900 1      【备注】:这里是指900秒检查一次,如果有1条写命令,则马上做快照
  save 300 10    【备注】:这里是指每300秒检查一次,如果写命令达到10条,则马上做快照
  save 60 10000   【备注】:这里是指60秒检查一次,如果写命令达到10000条,则马上做快照

  【备注】:这里多配置几条save命令,大概就是几个while循环,如果判断到写命令达到要求,则马上做快照,然后sleep多少秒,再判断。。。

          如果在sleep过后判断到条数没有达到要求,则不作快照,继续sleep。

  【备注】:可以通过手动执行save等命令来立即做快照,但是这种是会在主线程做快照会使得client阻塞。

   【备注】:kill掉redis-server时,系统会做一次快照。这个应该是linux系统的机制,会发信号给redis-server,这个server会先做好快照然后再退出。

2)aof方式

  aof方式是指每条写命令会追加到文件的方式来保存内存的数据到磁盘。

  aof可以设置fsync就是说多久写一次磁盘,因为写文件首先是写到磁盘缓冲区,如果不设置fsync,那么就是按照系统的30秒从缓冲区真正写到到磁盘。默认是设置的1秒写一次。还可以设置每条命令后马上更新磁盘,但是这样的性能最差。每秒执行一次fsync是一个折中的方法。

  aof写文件的方式也是fork一个子进程,然后rename临时文件。

  【备注】aof文件会把每条写命令都记入文件,比如inrc一个key,如果100遍,就会有100条命令,会使文件很大。aof文件可以通过rewrite方式重新,就是多条对同一个key的写操作会保存最后的值第一条命令。

2、小结

1)快照的优点:

  做快照的性能相对aof是更好一些。另外就是rdb文件的大小问题,会比aof文件小,还有就是rdb文件保存的数据是经过编码的,恢复到内存会更快。

2)快照的缺点:

  在做快照之前如果系统奔溃会导致上一次快照后到当前时间的数据没有能够保存。

  快照的过程是把所有的内存数据都导出来写到文件,如果内存数据过大,那么做快照会耗性能。

3)aof的优点:

  每条命令都会记录到文件,减少由于系统奔溃引起的数据丢失。aof方式所有命令可以追加方式写到文件,如果误运行了flushall删除了所有数据,可以停止server,然后在aof文件上删掉flushall,然后数据可以恢复。只要flushall后没有做重写,那么是可以恢复的。

4)aof的缺点:

  aof文件的体积问题,aof文件的编码问题,我们可以清晰看到每条命令,那么恢复到内存也会慢一些。

原文地址:https://www.cnblogs.com/guangye/p/7448533.html