redis 持久性

1,redis 优缺点

 优点:redis将数据都存储在内存中,所以访问速度快。

 缺点:重启后内存中的数据将全部丢失。

2,持久性

  持久性:redis 将数据从内存中以某种形式同步到硬盘,使得重启后可以根据硬盘中的记录恢复数据。

3,持久性的两种方式

  • RDB方式:根据指定的规则“定时”将内存中的数据存储在硬盘上。
  • AOF方式:在每次执行命令后将命令本身记录下来。

4,RDB方式

    rdb方式的持久性,当符合一定条件时,redis会自动将内存中的所有数据生成一份副本并存储在硬盘上,这个过程称为快照。

  快照原理,过程如下:

  • redis 使用fork 函数复制一份当前进程(父进程)的副本(子进程);
  • 父进程继续接收并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件;
  • 当子进程写入完所有数据后会用临时文件替换旧的rdb 文件,至此一次快照操作完成。

   redis在快照过程中不会修改rdb 文件,只有快照结束后才会将旧的文件替换成新的,也就是任何时候rdb 文件都是完整的。

   redis 启动后会读取rdb 快照文件,将数据从硬盘载入内存。

   通过rdb 持久化,一旦redis 异常退出,就会丢失最后一次快照以后更改的所有数据。

5,rdb 快照的几种情况

  • 根据配置规则进行自动快照。
  • 用户执行 save 或 bgsave。
  • 执行flushall 命令。
  • 执行复制(replication)。

5.1 根据配置规则进行自动快照

      进行快照的条件可以由用户在配置文件中自定义,由两个参数构成:时间窗口M 和改动的键的个数N。每当时间M 内被更改的键的个数大于N 时,即符合自动快照条件。

      save 900 1     (在15分钟内有一个或一个以上的键被更改则进行快照,15分钟=900秒)

     save 300 10    (在300秒内至少有10个键被更改)

    save 60  10000

   每条快照条件占一行,并且以save 参数开头。同时可以存在多个条件,条件之间是“或”的关系。

5.2 用户执行save 或bgsave 命令

     这是手动执行快照。区别是save 命令,在快照 执行过程中,redis 会阻塞所有来自客户端的请求;而bgsave 可以在后台异步地进行快照操作,快照的同时服务器还可以继续响应来自客户端的请求。

5.3 执行flushall 命令

    flushall 命令,redis 会清除数据库中所有数据。

  • 当自动快照条件不为空时,不论清空数据库的过程是否触发了自动快照的条件,redis 就会执行一次快照操作;
  • 当没有定义自动快照条件时,执行flushall 时不会进行快照。

5.4 执行复制

    当设置了主从模式时,redis 会在复制初始化时进行自动快照。即使没有定义自动快照条件,并且没有手动执行过快照操作,也会生成rdb 快照文件。

 

6,AOF 方式

   AOF 将执行的每一条命令追加到硬盘文件中,当使用redis 存储非临时数据时,一般需要打开aof 持久化来降低进程中止导致的数据丢失。

6.1 AOF 方式开启

   默认情况redis 是关闭的,可以通过appendonly 参数启用:

   appendonly  yes

  开启aof 后,每执行一条更改redis 中数据的命令,redis 就会将该命令写入硬盘中的AOF 文件。

6.2 AOF 实现

   AOF 文件以纯文本的形式记录了redis 执行的写命令,该内容正是redis 客户端向redis 发送的原始通信协议的内容。

   在启动时redis 会逐个执行 aof文件中的命令将硬盘中的数据载入到内存中,载入的速度相较rdb 会慢一些。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章