zoukankan      html  css  js  c++  java
  • 【Redis】大白话聊聊Redis如何实现持久化

    Redis两种持久化方式:

    1》RDB(snapshotting快照)

    • Redis的默认持久化方式(把数据做一个备份,将数据存放到磁盘中)

    这种方式是将内存中的数据,以快照的方式写入到二进制文件中,存放默认文件是【dump.rbd】。

    可以通过配置文件来配置这个持久的方式,说白了就是持久化频率,缓存数据我多久做一个持久化,每次持久化多少数据。

    主要就是通过遍历所有缓存数据,通过【save】,已被废弃,现主要用【bgsave】,全部持久化到一个【.rdb】格式结尾的文件中。

    • 话不多说,看看操作规则就秒懂了:
    Save 900 1 //900秒后有1个key发生变化,执行bgsave
    
    Save 300 10 //300秒后有10个key发生变化,执行bgsave
    
    Save 60 10000 //60秒后有10000个key发生变化,执行bgsave
    • RDB持久化流程是什么呢?
    1》redis根据配置去尝试生成一个【.rdb】快照
    
    2》redis-server会fork一个子进程
    
    3》子进程将数据dump到一个临时【.rdb】文件中
    
    4》然后通过临时文件来覆盖替换之前的持久化文件,并且每一次生一个新的临时文件都会做替换
    • 那么RBD有什么弊端呢:
    如果redis服务一不小心宕掉的话,那么最后一次save持久化之后的数据,有可能全部丢失掉。
    • 触发方式:
    
    
    1. 如果从节点执行全量复制操作,主节点自动执行BGSAVE生成RDB文件并发送给从节点。
    2. 执行debug reload命令重新加载Redis时,也会自动触发save操作。
    3. 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则自动执行BGSAVE。

    2》AOF(Append-onlyfile)

    • 简单来说,就是把所有的写命令保存起来

    AOF就是将Redis每一次写命令都追加到持久化文件中,然后重启系统的时候,都会运行这个文件中的写命令。

    • 当然由于os会在内核中缓存写命令,所以可以不会缓存那么快,这样导致aof也会造成数据丢失。所以我们也可以修改配置文件来配置aof缓存机制:
    // 表示Redis写操作后不回有【fsync()】操作调用,而是有操作系统自动调度刷新磁盘,性能是最好的
    Appendfsync no 
    
    // 表示Redis每次写操作后都会手动调用【fsync()】,将数据强制写入操盘,性能是最慢的,但是持久化效果最好
    Appendfsync always 
    
    // 表示每秒同步一次,即每秒强制写一次,在性能和持久化方面做了很好的这种 
    Appendfsync Everysec 
    • AOF中有一个【AOF Rewrite】,那什么是【AOF Rewrite】呢?

    一般Redis中数据是有限的,很多数据都会自动过期,或者被用户删除,又或者被Redis的清除算法清理,从而淘汰。

    Redis中数据会不断淘汰旧的,只有一部分常用的数据会存放在内存中。

    所以可能之前很多被清理的数据,都保留在AOF日志中,因为AOF日志只有一个,会不断的膨胀变大,

    所以AOF会每隔一段时间,进行一次【rewrite】操作。举个例子:

    比如AOF日志中已经存放了100w的数据指令,但我们的Redis中,由于过期或被用户删除,
    
    实际上只剩下了10w数据,此时基于这10w数据我们重新构建一个新的日志并覆盖之前的AOF日志,
    
    从而确保日志文件不会过大,并与内存中尽量一致。
    • 我们可以在redis配置文件中配置rewrite策略:
    /**
    
    比如说上一次AOF rewrite之后,是128mb,然后就会接着128mb继续写AOF的日志,
    
    如果发现增长的比例,超过了之前的100%,256mb,就可能会去触发一次rewrite
    
    但是此时还要去跟min-size,64mb去比较,256mb > 64mb,才会去触发rewrite
    
    **/
    
    auto-aof-rewrite-percentage 100
    
    auto-aof-rewrite-min-size 64mb
    • AOF具体过程是什么?
    1》Redis-Server先fork一个子进程;
    
    2》子进程基于当前的内存数据,构建日志,开始往新的临时AOF文件中写入日志;
    
    3》Redis主进程,接到客服端的写操作时,继续往旧的AOF日志中追加数据,此时Redis中有两个日志文件,一个是子进程创建的临时日志,一个是主进程的AOF日志
    
    4》子进程写完创建完临时AOF日志后,将Redis主进程新追加的日志写入到临时日志中;
    
    5》用临时日志覆盖主进程的旧AOF日志
    • AOF的有什么弊端呢?
    如果一个业务的并发上万,那么AOF日志系统可以说是非常庞大的,所以恢复重建功能就会很漫长

    Redis中的AOF和RDB如何选择呢:

    1》不要仅仅使用RDB,那样会导致丢失数据;
    
    2》也不要仅仅使用AOF,如果AOF中出现指令bug或文件损坏,那么可能会造成数据恢复失败;
    
    3》综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择;
    
    因为RDB更具有健壮性,用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复
  • 相关阅读:
    Mysql升级过程的问题
    关于SSM项目注解事务不回滚的问题
    Linux环境下tomcat如何热部署
    Windows系统下python3中安装pyMysql
    jvm性能监控及故障处理工具(《深入理解java虚拟机》)
    jvm垃圾回收器(《深入理解java虚拟机》)
    jvm-运行时数据区域(《深入理解java虚拟机》)
    java源码分析-String
    java源码分析-Object
    2019秋季PAT甲级题解(无第一题)
  • 原文地址:https://www.cnblogs.com/boluopabo/p/13061467.html
Copyright © 2011-2022 走看看