美文网首页
Redis的RDB和AOF持久化

Redis的RDB和AOF持久化

作者: zxin1 | 来源:发表于2017-06-12 02:36 被阅读0次

Redis作为目前最流行的缓存系统,当然它也是一种基于内存的数据库,所以能够拥有良好的性能。如何将内存中的数据进行持久化?

RDB方式持久化

RDB持久化操作的时机:

  1. 根据配置规则进行自动快照
    redis的配置文件中你可以自定义快照条件,就像这样:
    save 900 1
    save 300 10
    save 60 10000
    时间窗口M和改动的键的个数N,每当在时间窗口M内改动的键数大于N,RDB持久化操作就会被出发。
  2. 用户执行save或者bgsave命令
    save命令会阻塞所有来自客户端的连接,不推荐使用。
    bgsave命令会后台异步地进行快照操作,快照的同时服务器还可以继续处理来自客户端的请求。
    bgsave命令进行快照的原理:
    1、redis使用fork函数复制一份当前进程(父进程)的副本(子进程)。
    2、父进程继续处理客户端的请求,子进程进行快照操作。
    3、当子进程把内存中的所有数据当写入临时文件之后,覆盖旧的RDB文件。(RDB文件始终是完整的!!)
  3. 执行flushall命令
    执行flushall命令时,会清除内存中的所有数据。只要快照条件不为空,即使没有触发快照条件,也会进行一次RDB持久化操作。
  4. 主从节点进行复制时
    主从服务架构下,只要数据库接受到sync命令(从数据库启动后,会向主数据库发送sync命令),就会进行后台快照。

AOF方式持久化

Redis默认是不开启AOF持久化方式的,当时如果数据库中存放是非常重要的数据亦或是非临时数据,这个时候就要开启AOF持久化方式。

  1. AOF持久化方式的实现
    RDB文件中存放的内存中键值对(当然这些数据经过压缩,以二进制形式存储),而AOF文件中存放的是对redis进行的写命令。没当进行写操作时,redis就会将写命令追加到AOF文件中(类似于日志的方式)。
  2. AOF文件重写
    假如我们执行三条如下命令
set age 10
set age 20
set age 25

内存中有效的数据仅仅是age 25,当时第一条和第二条命令同样会被追加到AOF文件中,随着时间积累,AOF文件中无效的命令越来越多,这个时候就需要进行AOF重写。
重写的过程只和内存中的数据有关,和之前的AOF文件无关。

同步硬盘数据

开启AOF的情况下,每当redis执行一条写命令时,都会将命令追加到AOF文件中,但是由于操作系统的缓存机制,命令本身并没有真正被写入到文件中,还在操作系统的硬盘缓存中(内存中),所以我们需要进行同步操作。
redis有三种同步规则

appendfsync always   每次执行写入操作时都会进行同步操作
appendfsync everysec  每隔一秒就有子进程进行同步操作
appendfsync no  从不主动进行同步操作,而是由操作系统进行同步操作(默认30秒进行一次同步操作)

相关文章

网友评论

      本文标题:Redis的RDB和AOF持久化

      本文链接:https://www.haomeiwen.com/subject/flikqxtx.html