美文网首页
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