Redis的持久化机制

Redis的持久化机制

第一章 Reids单线程为什么这么快?
第二章 Redis的持久化机制



前言

想必大家都知道,Redis是基于内存进行的读写操作,这也是它快的一个原因,但是正因为它是在内存中进行操作,数据的安全性得不到保障,如果服务器某天宕机了的化那我们数据将会面临丢失的风险。那么Redis是怎么解决这一问题的呢,答案就是持久化。接下来我将会给各位讲解reids的持久化的实现以及不同实现方法它们各自的优缺点。


一、Redis持久化的实现机制

Redis 的持久化主要是有两种一种是RDB(快照),另一种事AOF(日志)

二、RDB

RDB 全称 Redis DataBase(快照) 它会将某一时刻的内存快照(Snapshot),以二进制的形式写入磁盘
举个例子:
当前redis中有2个key,当前时间是下午1点40分redis使用RDB进行持久化就会把这2个key做成一份文件保存到磁盘中

RDB的手动触发

  • Save命令:使用Save命令时Redis的主进程将处于阻塞状态,直到RDB持久化完成,才会响应客户端的发来的命令(生产环境中慎用

  • bgSave命令:使用bgseave命令时Redis会fork出一个子线程进行持久化,主进程只在fork过程中会短暂阻塞,fork时reids的父子进程会有一个数据共享区域,类似于Github的分支。当Reids创建完成这个分支后,主进程就可以响应客户端发来的命令了。
    (fork是操作系统提供的一种父子进程机制)

     那么此时有靓仔要问了,你创建子线程写数据怎么保证数据的准确性呢?
     答:fork子进程利用了操作系统的写实拷贝机制也称COW(copy OR write),通过写实拷贝。
     举个例子:
     下午一点四十时Redis开始了bgsave命令,下午一点四十一时来了个写入命令,
     那么Redis将会把和fork出的子进程和自己的数据共享区域copy一份,然后去修改copy文件中的数据。等子进程保存完了再把数据写回去。
     此时就保证了子进程拷贝的数据的数据全是下午一点四十之前的数据了。
    

RDB的自动触发

  • save m n:在m秒内,如果有n个键发生改变,则自动触发持久化,通过bgSave执行,如果设置多个,只要满足其中一个就会触发,配置文件中默认配置了(可以注释掉)

     举个例子:
     比如我们设置了10秒内监控5个键,然后我们又设置了一个200秒内监控100个键
     此时两个命令只要满足其中一个就会触发,redis先会统计10秒内到达了5个先触发一次,200秒到达了100个又触发一次。
     如果10秒内监控的5个键中只有4个法师了改变,而200秒内监控的100个键都发生了改变此时也会触发一次
    
  • flushall:用于清空Redis所有的数据库,flushdb清空当前Redis所在的库(默认是0号数据库),会清空RDB文件,同时也会生成一个空的dump.rdb文件。(慎用

  • 主从同步:全量同步时会触发bgSave命令,生成rdb文件发送给从节点

RDB的优缺点

优点

  1. 整个Redis数据库只有一个dump.rdb文件,方便持久化。可以拷贝出来。
  2. 容灾性好,方便备份。
  3. 性能最大化,fok子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。使用单独子进程来进行
    持久化,主进程不会进行任何IO操作,保证了redis的高性能。
  4. 相对于数据集大时,比AOF的启动效率高。

缺点

  1. 数据安全性低。RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这
    种方式更适合数据要求不严谨的时候)
  2. 由于RDB是通过fok子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务
    器停止服务几百毫秒,甚至是1秒钟。会占用cpu

三、AOF

AOF 全称 Append Only File 以日志的形式记录服务器锁处理的每一个写、删命令,查询命令不会记录,以文本的形式记录,可以打开文件看到详细的操作记录,调用操作系统命令进程刷盘

AOF 的操作流程

  • 所有的写命令会追加到AOF缓冲中。
  • AOF缓冲区根据对应的策略向硬盘进行同步操作。
    注意这里的“策略”,并不是所有的命令都会往log文件里去写,这里使用到了一个缓冲区的概念,它会将命令暂时存入内存缓冲区中,然后根据一定的策略把一些命令写入日志文件中
  • 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。
    如何理解这里的重写达到压缩的目的。比如现在有三个List 分别存储的是A,B,C.这三条数据,当我们定期重写时就会发现其实这三条数据用一个List存储也可以。重写后就只有一个List里面分别 存储的A,B,C,此时压缩的目的就达到了
  • 当Redis里启时,可以加载AOF文件进行数居恢复。

同步策略

  • 每秒同步:故名思意就是每过一秒就将AOF缓冲区的数据写入log文件中去,异步完成,效率非常高,一旦系统出现宕机现象,那么这一秒之内的修改的数据将会丢失。
  • 每修改同步:也就是每写一条就同步一条,此时的同步技术是调用的系统的fsync, 同步持久化,每次发生数据变化都会被立即记录到磁盘中,系统出现宕机,最多丢失一条。
  • 不同步:由系统操作自己控制,可能会丢失多数据。
    注意这里的不同步并不是说不进行持久化,只是说我们不去干预Redis的持久化,怎么持久化由它自己决定

AOF的优缺点

优点

  1. 数据相对安全
  2. 通过append模式写文件,即使中途出现服务器宕机也不会破坏已经存在的内容,可以通过reids-check-aof工具解决数据一致性问题
  3. AOF机制的rewrite模式,定期队AOF文件进行重写,以达到压缩的目的

缺点

  1. AOF文件比RDB文件大,且恢复速度慢。
  2. 数据集大的时候,比RDB启动效率低。
  3. 运行效率没有RDB高。

四、总结

AOF文件比RDB更新频率高,优先使用AOF还原数据。
AOF比RDB更安全,文件也更大
RDB性能比AOF好
如果两个都配置了优先加载AOF
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

或与且与或非

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值