• Redis持久化怎么玩


    什么是持久化?

    将数据保存到可永久保存的存储设备中,持久化的主要应用是将内存中的对象存储到数据库中,或者存储到磁盘文件中、XML数据文件中等。

    也可以这样理解持久化:

    应用层:如果关闭( Close )你的应用,然后重新启动则先前的数据依然存在。

    系统层:如果关闭( Shut Down )你的系统(电脑),然后重新启动则先前的数据依然存在。

    为何要持久化?

    Redis的数据是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据会丢掉,因此为了让数据能够长期保存,就要将Redis里的数据做持久化存储。

    持久化有哪几种?

    Redis为持久化提供了两种方式:

    RDB
    每隔N分钟或N次操作,从内存dump数据形成rdb文件,压缩,放在备份目录,主要是以快照的方式进行保存。

    AOF
    记录每次对redis的命令操作,有点类似记录操作日志,当服务器重启的时候会重新执行这些命令来恢复原始数据。

    持久化配置

    RDB持久化配置

    #时间策略
    save 900 1 #900秒至少有一个变化,则dump
    save 300 10 #300秒至少有10个变化,则dump
    save 60 10000 #60秒至少有10000个变化,则dump
    
    stop-writes-on-bgsave-error yes #如果持久化出错,主程序是否停止写入
    
    rdbcompression yes #是否支持压缩
    
    rdbchecksum yes #存储和加载rdb文件时是否校验
    
    dbfilename dump.rdb #设置rdb文件名
    
    dir /usr/local/data #rdb文件保存路径
    

    如果想禁用RDB配置,在save的最后一行写上:save ""

    AOF持久化配置

    appendonly yes #是否开启aof,默认no
    
    appendfilename "appendonly.aof" #文件名称
    
    appendfsync everysec #同步方式
    
    no-appendfsync-on-rewrite no #aof重写期间是否不同步
    
    #重写触发配置
    auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小增长率100%时重写
    auto-aof-rewrite-min-size 64mb #aof文件至少64M时重写
    
    aof-load-truncated yes #加载aof时如果有出错的处理
    
    aof-use-rdb-preamble yes #文件重写策略
    

    appendfsync有三种模式:

    always:每一个命令都同步到aof,安全,速度慢。

    no: 由操作系统判断缓冲区大小,统一写入到aof,同步频率低,速度快。

    everysec:折中方案,每秒写一次,最多丢一秒。

    aof-load-truncated yes 如果配置启用,在加载时如果发现aof尾部不正确时,会向客户端写入一个log,但是会继续执行,如果设置为no,发现错误就会停止,必须修复后才能重新加载。

    持久化工作原理

    RDB工作原理

    RDB持久化触发分为两种:自己手动触发与Redis定时触发。

    手动触发

    • save:会阻塞当前redis服务器,直到持久化完成,线上应该禁止使用。
    • bgsave:该触发方式会fork一个子进程,由于进程负责持久化过程,因此阻塞只会发生在fork子进程的时候

    自动触发

    • 根据 save m n配置规则自动触发
    • 从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发bgsave
    • 执行 debug reload时;
    • 执行shutdown时,如果没有开启aof,也会触发

    AOF工作原理

    主要分为两步:

    1. 命令的实时写入,如果是appendfsync everysec配置,会有1s损耗
    2. 对aof文件重写

    aof重写是为了减少aof文件的大小,可以手动或者自动触发。

    • 手动触发:bgrewriteof
    • 自动触发:根据配置规则触发,当然自动触发的整体时间还跟Redis的定时任务频率有关系

    持久化恢复数据

    如果一台服务器上既有RDB文件,又有AOF文件,加载哪个呢?

    如果想要恢复数据,只要重启Redis即可。启动时会检查AOF文件是否存在,如果不存在就尝试加载RDB。优先加载AOF的原因是AOF保存的数据更完整,我们知道AOF基本上最多丢失1s的数据。如下图所示。

    redis数据恢复.png

    性能优化建议

    1. 如果Redis数据并不是很重要或者可以通过其他方式重写生成数据,可以关闭持久化,如果丢失数据可以通过其他途径补回
    2. 自定义策略定期检查Redis情况,然后可以手动触发备份、重写数据
    3. 单机如果部署多个实例,要防止多个实例同时运行持久化、重写操作,防止出现内存、CPU、IO资源竞争,让持久化变成串行
    4. 可以配置主从复制,利用一台从服务器进行备份处理,其他机器正常响应客户端的命令
    5. RDB持久化与AOF持久化可以同时存在,配合使用。

    本文作者: vic

    同步个人博客: http://geekvic.top/post/758625c3.html

    版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

  • 相关阅读:
    Idea中配置tomcat启动maven项目读取指定的profile文件
    idea下将springboot项目打成war包发布到本地tomcat服务器上
    NameNode多目录配置
    Android 集成百度ocr报错[283506] Load jni so library error
    Android 集成科大讯飞语音识别(语音听写)报错‘创建对象失败,请确认libmsc.so放置正确,且有调用createUtility进行初始化’
    Android 集成百度地图,定位,导航,围栏,禁区功能
    Android 加载本地图片失败的问题
    Android 闪光灯测心率
    剑指offer(一)
    腾讯云重启慢
  • 原文地址:https://www.cnblogs.com/TechSnail/p/13279482.html
Copyright © 2020-2023  润新知