redis 持久化

1、为什么要持久化?

  因为redis是内存数据库,它将自己的数据存储到内存中,一旦redis服务器退出运行,服务器中的数据就会消失。

  为了避免数据丢失,redis提供了持久化机制,将存储在内存中的数据保存到磁盘中,用于在redis服务器退出或者宕机时,快速恢复之前redis存储在内存中的数据。

  redis提供了两种持久化的方式:RDB和AOF

2、RDB

  RDB可以理解为快照,它是将某个时间点上redis中的数据保存到一个RDB文件中,该文件是一个经过压缩的二进制文件,通过该文件可以还原生产RDB时redis中的数据。

  2.1、创建rbd文件

    redis提供了两个命令,来创建rbd文件,一个是save,另一个是bgsave。

    save命令会阻塞redis服务器进程,知道rbd创建完成。在服务器阻塞期间,redis不能处理任何请求。

    bgsave命令会派生出一个子进程,然后由子进程负责创建rbd文件,服务器进程继续处理请求。

  2.2、修改配置保存rbd文件

    我们可以通过修改redis服务器配置文件,对保存rbd文件的策略进行设置

    

 

 

 

默认的配置条件表示,只要满足以下3个条件中的任意1个,BGSAVE命令就会被执行:

  • 服务器在900s(即15分钟)之内,对数据库进行了至少1次修改
  • 服务器在300s(即5分钟)之内,对数据库进行了至少10次修改
  • 服务器在60s(即1分钟)之内,对数据库进行了至少10000次修改

  2.3、RBD文件的载入

  RBD文件是在redis服务器启动时载入的,而且redis服务器是否会载入RBD文件是根据服务器是否启用了AOF持久化功能:

  1. 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据。
  2. 如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据

3、AOF

  AOF是通过保存redis服务器所执行的写命令来记录数据库的,默认情况下AOF是关闭的。

  3.1、开启AOF

  同样是在redis服务器的配置文件中

  

 

   3.2、AOF持久化的实现

    当AOF持久化功能处于开启时,redis服务器执行完成一个写命令后,会将被执行的写命令追加到AOF缓冲区的末尾,然后redis服务器会根据配置中的appendfsync选项的值来决定何时将AOF缓冲区写到AOF文件中。

    关于appendfsync选项:

      1)always:是最安全的,数据丢失的最少。但是效率最慢,服务器处理每个事件都会去写文件,影响性能

      2)everysec:每秒同步一次,即使出现宕机,也最多损失1s的数据

      3)no:从安全性来说,no模式下,如果出现故障停机,数据库会丢失上次同步AOF文件之后的所有写命令数据,具有不确定性,因为服务器在每个事件循环都要将AOF缓冲区中的所有内容写入到AOF文件,至于何时对AOF文件进行同步,则由操作系统控制。从效率来说,no模式和everysec模式的效率差不多。

    appendfsync默认的是everysec。

 

  3.3、AOF重写

    因为AOF文件记录的是服务器写命令,所以随着redis服务器运行时间的增加,AOF文件中的内容会越来越多,文件体积也会越来越大,如果不做控制,会过多的占用磁盘空间,而且通过AOF文件进行数据还原的时间也越来越长。

    为了解决AO文件体积越来越大的问题,Redis提供了AOF文件重写功能。redis服务器会创建一个新的AOF文件来替换现有的AOF文件,新旧AOF文件所保存的数据相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件的体积通常会比旧AOF文件的体积要小很多。

    redis可以执行bgrewrite进行AOF重写

  

 
posted @ 2020-04-10 21:58  醉深梦始  阅读(155)  评论(0)    收藏  举报