小白学Redis系列:Redis持久化

    Redis作为缓存数据库,区别于常规数据库的地方就在于Redis将数据存储在内存中,而不是硬盘中,因此数据的IO就十分快速,非常适合一些电商网站等数据IO频繁的场景。当然,内存中的数据在掉电之后就会被清空,而Redis的持久化功能使得内存中的数据能够以某种形式保存到硬盘中,当Redis重启时会自动从硬盘中恢复数据,从而保证数据不丢失。

     Redis的持久化方式有两种:

  • RDB方式
  • AOF方式

方式一:RDB方式

    RDB方式的持久化是通过快照完成的,当满足一定条件时,Redis会将内存中所有数据生成一份副本并存储在硬盘中,这个过程就称为快照。
Redis默认会将快照文件存储在Redis当前进程的工作目录的dump.rdb文件中,可以配置dir和dbfilename参数设定快照文件的存储路径以及文件名。以下几种情况会触发快照:
  • 根据配置文件中的条件执行快照
Redis允许用户在配置文件中自定义快照条件,有两个参数构成,一个是时间窗口M(单位为秒),另一个是改动的键的个数N,每当时间M内被更改的键的个数大于N个时,就触发快照动作例如:
save 900 1

save  300   10

每条快照条件占一行,以save参数开头,它们之间是"或"的关系。

  • 执行SAVE或BGSAVE命令

      处理上述Redis自动执行快照之外,有些情况需要我们手动去执行快照,例如进行服务重启,数据迁移等情况。Redis提供了两个命令来完成这一任务:

  1. SAVE命令:当执行SAVE命令时,Redis会同步的执行快照, 执行快照的过程 中会阻塞所有客户端的请求,因此当数据量较大时,Redis可能会出现长时间不响应的情况,因此生产环境应尽量避免使用SAVE命令。
  2. BGSAVE命令:当需要手动执行快照时推荐使用BGSAVE命令,BGSAVE命令可以在后台异步地执行快照动作,而快照的同事Redis服务端还能处理客户端的请求。

  • 执行FLUSHALL命令

      当执行FLUSHALL命令时,会清空Redis内存中的所有数据,但与此同时,无论清空的过程中是否触发了快照条件,只要自动快照的条件不为空,Redis就会执行一个快照动作。当没有定义快照条件时,执行FLUSHALL命令是不会触发快照动作的。

  • 复制初始化阶段

    当Redis以主从模式部署时,在复制初始化阶段,从数据库会向主数据库发送SYNC命令,触发主数据库执行一次快照动作。Redis复制的详细过程将在下一篇系列文中讲到。


    上述4种情况都会触发Redis的快照动作,但需要区分的是,除了执行SAVE命令触发的快照动作是同步的,其他方式的快照都是异步快照。下面简单阐述一下异步快照的过程:

  1. Redis使用fork函数复制一份当前进程(父进程)的副本(子进程)
  2. 父进程继续接收并处理客户端的请求,而子进程开始将内存中数据写入硬盘的临时文件
  3. 当子进程完成所有数据地写入后,会用该临时文件替换旧的RDB文件,至此一次快照动作就完成了

    需要注意的是,新的RDB文件存储的是fork函数执行那一刻的内存数据,父进程后续处理的写操作所影响的数据不会被记录新的RDB文件中,因此异步快照可能会丢失一部分数据


方式二:AOF方式

    默认情况下,Redis并没有开启AOF持久化,可以配置appendonly参数设置为yes开启。AOF文件保存位置可以通过dir选项设置,默认文件名为appendonly.aof,可以通过appendfilename选项设置。

    开启AOF持久化后,Redis每执行一条会更改内存数据的命令,就会将该命令写入硬盘中的AOF文件中,因此AOF文件中存储的不是内存中的数据,而是命令。Redis启动时,会逐条执行AOF文件中的每一条命令,因此相对于加载RDB文件来说,启动时间可能会相对较长,但AOF方式更能够保持数据的完整性。

    实际上,受操作系统的影响,Redis并不是真正地每执行一条写命令,都立即地实时地将该命令持久化到硬盘中,而是写入了硬盘缓存中,默认情况下,每30秒操作系统就会 执行一个同步操作,这是缓存中的数据才真正的持久化到硬盘中了。

    但30秒时间相对较长,这期间若系统出现异常,则有可能导致数据丢失,这当然是Redis不能容忍的。Redis允许用户在配置文件中设置appendfsync选项指定同步的时机。appendfsync选项有三个可选值:

always :实时写入到硬盘中,数据安全性最高但影响系统性能

everysec : 默认值,每秒执行一次同步

no : 不主动同步,交由系统完成,即30秒执行一次同步

    Redis允许同时开启AOF和RDB这两种模式,这种情况下,Redis启动时会加载AOF文件来恢复数据,因为AOF方式可能丢失更少的数据。


Ending ... 大笑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值