一、RBD方式

  rdb方式是通过快照的形式将内存中的数据保存一份副本存储在硬盘。

1、配置文件自动执行快照

  在配置文件中设置参数,可以使redis服务在一定条件下自动执行快照。配置如下:

  save  900 1

  save  300 10

  save  60   1000

  意思是,在N秒内有M次对数据的操作就要执行一次快照,如900秒至少有一次数据操作就执行一次快照。

2、手动执行快照

  SAVE命令

  该命令会占用Redis的主进程,可能会使redis阻塞客户端的请求。这种指令无法达到边服务边操作的效果。

  BGSAVE命令

  该命令可以达到后台异步执行的效果,快照的同时可以接受来自客户端的请求。在执行BGSAVE命令后,redis会返回OK,表示后台开始执行快照操作。执行快照成功与否可以通过LASTSAVE指令查看最近一次执行快照成功的时间,如果是当前时间,说明快照结束。

3、快照的原理

  快照可以将内存中的数据备份到磁盘,在服务器重新启动时可以从dump文件中获取数据加载到内存,实现客户端与数据库服务的交互。内存与磁盘的交互图如下:

  在执行快照时,会fork出一个子线程,该子线程会产生一个虚拟内存空间,进行一个write操作,CPU 资源很紧张。因此,如果在一台物理机上部署多个 Redis,应该避免同时持久化操作。将所有的数据写入一个临时文件,在快照结束,会自动替换掉原有的dump文件。因此在快照的同时需要占用大量的内存。

二、AOF方式

  AOF方式是将对数据的操作以文件的形式保存起来,文件中存储的只是对数据操作的指令。

1、配置文件的设置

  1. # 是否开启AOF,默认关闭(no)  
  2. appendonly yes  
  3. # 指定 AOF 文件名  
  4. appendfilename appendonly.aof  
  5. # Redis支持三种不同的刷写模式:  
  6. # appendfsync always #每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。  
  7. appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。  
  8. # appendfsync no     #完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。    
  9. #在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。  
  10. #设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no  
  11. no-appendfsync-on-rewrite no   
  12. #当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。  
  13. auto-aof-rewrite-percentage 100 
  14. #当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。  
  15. auto-aof-rewrite-min-size 64mb  

2、AOF文件的展现

文件的格式如下:
*2 # 2 个参数 $6 # 第一个参数长度为6 SELECT # 第一个参数 $1 # 第二参数长度为1 8 # 第二参数 *3 # 3 个参数 $3 # 第一个参数长度为4 SET # 第一个参数 $4 # 第二参数长度为4 name # 第二个参数 $4 # 第三个参数长度为4 Jhon # 第二参数长度为4
所有对数据的操作命令都会存储在该文件中,随着对同一条数据的操作指令的不断增多,会在文件中产生较多的冗余数据。redis可以自动对aof文件进行优化,最后一条指令会覆盖以前的所有指令,只保留最后一条指令。

3、AOF原理

AOF的方式分为两种,后台执行和边服务边执行。

后台执行:

服务在产生数据变更的时候,不仅会修改内存中的数据集。还会将该操作记录到server.aofbuf 文件中文件中,所有的操作都会积累到该文件,等到后台有fork子进程的时候,会将该部分数据通过server.aofbuf 文件传输到server.aof_rewrite_buf_blocks文件中。等到子进程结束后,server.aof_rewrite_buf_blocks文件中的数据会追加到磁盘文件。

边服务边执行:

会将所有的数据操作,保存到server.aofbuf 文件中,会在特定时期将文件中的数据持久化到磁盘文件。

两者的联系:

在后台执行时,开启子进程将server.aofbuf 文件中的数据持久化到temp-rewriteaof-bg-%d.aof文件,待子进程结束,将server.aof_rewrite_buf_blocks文件中的数据追加到server.aof_rewrite_buf_blocks文件中。同时将便服务边执行的server.aof_filename 文件替换掉,重新生成server.aof_filename文件。从而达到双保险的效果。

关系图如下: