持久化

写在前面

linux系统中:

  1. 父子进程数据是隔离的
  2. 父进程可以让子进程看到父进程的数据,采用export修饰
  3. export的环境变量,父子进程的修改互补影响,影响范围仅为自身进程

redis如何在非阻塞的情况下对某一时刻数据进行持久化

  1. redis父进程使用fork()系统调用,创建一个子进程,其为redis中创建那一刻中虚拟地址的拷贝,其虚拟地址同样指向相同的内存地址,则有两个虚拟地址引用了该物理地址
  2. fork()实现了copy on write内存机制,在父进程修改数据时,首先会在内存中写入修改的值,并将指针从原来的地址指向新的地址,所以子进程的数据不会改变,还是那一刻的数据,从而达到非阻塞保存时点快照

fork()特点:速度快,占用空间小

RDB

  • 主动(同步阻塞):比如关机维护时使用

  • 被动(异步非阻塞):fork()系统调用,可在配置文件中配置触发规则

    #在多少秒后至少有多少个key发生变化触发写入磁盘操作(可配置多条)
    save <seconds> <changes> #默认开启,可增加 save "" 表示禁用
    
    • 如果想要修改写入磁盘文件名称,找到dbfilename dump.rdbdump.rdb改为需要的文件名
    • 如果想要修改写入磁盘文件位置,找到The working directory注释,重写其dir路径即可

    只要触发了RDB操作,等待该操作完成后,下一次的RDB触发才可执行

弊端

  1. 不支持拉链,永远只有一个dump.rdb文件,需要人为干预进行备份
  2. 时点与时点之间窗口数据容易丢失,如:8点得到一个RDB数据文件,9点刚要触发RDB,宕机了,那么8点到9点的数据就丢失了

优点:类似java中的序列化,恢复的速度相对较快(rdb文件为二进制文件,可以对数据进行快速恢复)

适当的配置redis最大存储空间maxmemory可以提升RDB的效率,最大空间过大会导致RBD时间过长

AOF

RDB与AOF可以同时开启,如果开启了AOF只会使用AOF进行数据恢复

优点:数据丢失少

弊端:操作日志文件的体量会越来越大,从而导致恢复慢

针对弊端redis根据让日志只记录增量且合并重复命令的原理对AOF进行了优化:

  • 4.0前:重写日志文件,删除抵消的命令合并重复的命令,得到一个缩小版的纯指令的日志文件

  • 4.0后:重写日志文件,将某一刻老的数据RDB到AOF文件中,将增量的指令以追加的方式追加到AOF文件中

    AOF是一个混合体,既利用了RDB的快速恢复也利用了日志的全量特点

相关配置

  1. AOF默认关闭:appendonly no -> yes开启AOF
  2. 默认AOF文件名:appendfilename "appendonly.aof" 可自定义
  3. redis往aof文件中刷写的策略
    1. appendfsync always:每来一条指令调用一次内核将数据直接刷写到磁盘,最多丢失一条数据(一条指令正在写宕机了);数据最可靠
    2. appendfsync everysec:每秒触发一次I/O对buffer进行flushaof文件中,可能会导致接近一个buffer缓存内容的丢失;数据较为可靠
    3. appendfsync no:每当内核buffer缓冲区内容填满时触发一次I/O,对缓冲区的数据flush写入磁盘aof文件;最多丢失一块buffer缓冲区内容数据,换来I/O成本最少
  4. no-appendfsync-on-rewriteyes/no(默认)当redis抛出一个子进程进行AOF重写或者RDB重写,允不允许序号3的策略进行aof文件的写入,yes可能会导致一部分性能阻塞,no可能导致一些数据的丢失
  5. aof-use-rdb-preamble yes:开启重写日志文件,见上4.0后;如果aof文件以REDIS开头的则是重写过的混合体文件(默认开启)
  6. 自动触发BGREWRITEAOF(重写)规则
    1. auto-aof-rewrite-percentage [百分比(省略%)]:记录6.2.命令达到的百分比触发重写
    2. auto-aof-rewrite-min-size [文件大小(mb)]:首次aof文件达到该大小且满足6.1.自动触发重写,并且redis会记录重写后此时文件大小lastSize,当文件超过lastSize的设置百分比6.1.时再次出发重写,依次类推自动重写操作(此变量仅初始化启动redis有效,如果是redis恢复时,则lastSize等于初始aof文件大小)

实操

关闭混合模式

  • vi /etc/redis/6379.conf

    #关闭redis后台运行
    daemonize no
    #logfile "" 默认控制台打印,并无日志输出,需要日志输出指定输出路径即可(注释也是前台控制台打印)
    #配置RDB save策略
    save 3600 1
    save 300 100
    save 60 10000
    #开启AOF
    appendonly yes
    #关闭混合模式
    aof-use-rdb-preamble no
    

    异常备注

    #在redis进程kill又自动启动的情况下,关闭进程,无密码省略 -a [password]
    redis-cli -a [password] shutdow
    
  • redis-server /etc/redis/6379.conf

    使用指定的配置文件启动redis,会在配置的文件目录下生成持久化的文件

  • set k1 helloaof文件中生成如下内容:

    #根据该文件,可对命令进行解析执行
    *2                          #*代表下面指令由几个元素组成
    $6                          #描述下一行元素由几个字节组成
    SELECT                  #元素1
    $1
    0                               #元素2
    *3
    $3
    set
    $2
    k1
    $5
    hello
    
  • bgsave:触发fork(),在持久化目录中会将当前数据序序列化到磁盘rdb文件,其文本开头位REDIS

    REDIS0009ú      redis-ver^E6.2.1ú
    redis-bitsÀ@ú^EctimeÂ<91>Ü/cú^Hused-mem -^Q^@ú^Laof-preambleÀ^@þ^@û^B^@^@^Bk1^Ehello^@^Bk2^Dooxxÿ8^[<97>XË^H@O
    
  • redis-check-rdb dump.rdb:检查rdb文件是否正常

    armin@xiaobawangxuexiji-2 db % redis-check-rdb dump.rdb
    [offset 0] Checking RDB file dump.rdb
    [offset 26] AUX FIELD redis-ver = '6.2.1'
    [offset 40] AUX FIELD redis-bits = '64'
    [offset 52] AUX FIELD ctime = '1664081041'
    [offset 67] AUX FIELD used-mem = '1125792'
    [offset 83] AUX FIELD aof-preamble = '0'
    [offset 85] Selecting DB ID 0
    [offset 116] Checksum OK
    [offset 116] \o/ RDB looks OK! \o/
    [info] 2 keys read
    [info] 0 expires
    [info] 0 already expired
    
  • BGREWRITEAOF:后台重写aof文件,去除无效重复指令*(如果在一个key值中多次重写key值,aof文件中仅会存储最后一条指令)*

开启混合模式

  • vi /etc/redis/6379.conf

    aof-use-rdb-preamble yes
    
  • redis-server /etc/redis/6379.conf:持久化目录下出现一个空的aof文件

  • set k1 a; set k1 b; set k1 c; set k1 d:目前aof文件内容:

    *2
    $6
    SELECT
    $1
    0
    *3
    $3
    set
    $2
    k1
    $1
    a
    *3
    $3
    set
    $2
    k1
    $1
    b
    
  • BGREWRITEAOF:手动执行重写后,打开aof文件*(变为序列化内容)*

    REDIS0009ú      redis-ver^E6.2.1ú
    redis-bitsÀ@ú^EctimeÂXæ/cú^Hused-memÂP-^Q^@ú^Laof-preambleÀ^Aþ^@û^A^@^@^Bk1^Adÿ^Yuâ¶<86>ç«>
    
  • set k1 e; set k1 f:继续对key重新赋值,再查看aof文件*(后面的内容以追加指令的形式追加到aof文件中,此时的文件为混合文件)*

    REDIS0009ú      redis-ver^E6.2.1ú
    redis-bitsÀ@ú^EctimeÂXæ/cú^Hused-memÂP-^Q^@ú^Laof-preambleÀ^Aþ^@û^A^@^@^Bk1^Adÿ^Yuâ¶<86>ç«>*2^M
    $6^M
    SELECT^M
    $1^M
    0^M
    *3^M
    $3^M
    set^M
    $2^M
    k1^M
    $1^M
    e^M
    *3^M
    $3^M
    set^M
    $2^M
    k1^M
    $1^M
    f^M
    
  • bgsave:将以上时点数据持久化到rdb文件

  • BGREWRITEAOF:重写aof文件,目前内容与bgsave得到的rdb文件解析内容一致,均为以上时点序列化的数据

注意:无论在是否混合模式下的aof持久化,在最后有执行flushall或相关清库指令,如果想要恢复清库前的数据,不可执行BGREWRITEAOF重写操作,否则数据无法找回*(重写后的aof文件仅有清库指令)*;此种情况恢复数据需要将aof文件中最后一条清库指令移除再进行数据导入

Redis持久化配置与操作相关推荐

  1. Redis持久化配置

    Redis持久化配置持久化: 即把数据存储于断电后不会丢失的设备中,通常是硬盘. 常见的持久化方式:主从:通过从服务器保存和持久化,如mongoDB的replication sets配置. 淘宝是主服 ...

  2. 运维之道 | Redis 持久化配置

    Redis 持久化配置 前言 Redis为持久化提供了两种方式: RDB:在指定的时间间隔能对你的数据进行快照存储. AOF:记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的 ...

  3. docker+redis 持久化配置(AOF)

    RDB持久化与AOF持久化简单描述 RDB:RDB使用快照的方式存储数据库中的内容,直接将所有键值对数据全部存入二进制文件.建议使用BGSAVE来进行备份,整个过程会新fork一个子进程来执行,不影响 ...

  4. redis持久化配置及两种方式

    持久化 redis持久化是指在指定的时间间隔内将内存中的数据集快照(snapshotting)写入磁盘,恢复时是将快照文件读入内存 redis提供了两种持久化方式 一:RDB内存快照 1:概念 RDB ...

  5. Redis[5] key的过期时间删除策略、实现lru算法、持久化配置

    文章目录 Redis[5] key的过期时间删除策略.持久化配置 **Redis6的key过期时间删除策略** Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务 ...

  6. Redis-学习笔记03【Redis持久化】

    Java后端 学习路线 笔记汇总表[黑马程序员] Redis-学习笔记01[Redis环境搭建] Redis-学习笔记02[Redis命令操作] Redis-学习笔记03[Redis持久化] Redi ...

  7. Docker安装Redis以及配置Redis环境

    1,下载Redis镜像 首先拉取 Redis 镜像, 这里我选择的是 redis:alpine 轻量级镜像版本 docker pull redis:alpine 下载完成后,通过 docker ima ...

  8. 跟着狂神学Redis(NoSql+环境配置+五大数据类型+三种特殊类型+Hyperloglog+Bitmap+事务+Jedis+SpringBoot整合+Redis持久化+...)

    跟着狂神学Redis 狂神聊Redis 学习方式:不是为了面试和工作学习!仅仅是为了兴趣!兴趣才是最好的老师! 基本的理论先学习,然后将知识融汇贯通! 狂神的Redis课程安排: nosql 讲解 阿 ...

  9. redis主从配置之持久化配置

    环境描述: centos:7.6docker:19.03.1redis:6.0.9 对于centos怎么装docker,docker又怎么装redis镜像等等内容就不做概述了.如果还不会这个,就先去百 ...

最新文章

  1. PCL :K-d tree 2 结构理解
  2. WebService调用(基于KSOAP2)
  3. 控件尺寸规范_微信小程序设计规范你了解多少
  4. Git 常用命令速查表(图文+表格)【转】
  5. LeetCode 2208. 将数组和减半的最少操作次数(优先队列)
  6. logminer java_使用OracleLogminer同步Demo1Demo介绍-博客园.PDF
  7. java 注释快捷打出时间_Java快捷---自动注释时间作者。。。
  8. 图像处理保研面试_细思极妙的保研面试经验汇总?这些小技巧太加分了吧
  9. linux mq脚本,Linux自动化命令工具expect
  10. 希捷四十载:如何做好一家非常规存储公司?
  11. Win11如何提高游戏性能?Win11提升游戏性能的方法
  12. 我的站(艾网---城市生活新门户)重新上线了
  13. Dart 基础篇-所有知识点架构
  14. 如何使用计算机改进生产线,计算机系统结构复习资料
  15. 马蜂窝张矗:绩效考核是为了激发工作潜力,而不是逃避问题
  16. 《站在两个世界的边缘》 程浩,一个认真生活过的人
  17. c语言里的除法运算定律,加法乘法运算,乘法需要打括号吗?
  18. 一文读懂随机森林的解释和实现(附python代码)
  19. 感谢同事的临别赠言,愿自己一路顺风
  20. win10关闭自带的杀毒

热门文章

  1. 关于CSGO理财游戏的一些心得(二)
  2. vr片源免费网址_手机玩VR,你还可以这样做
  3. PowerPoint2013支持的视频和音频文件格式
  4. 公务员计算机科学与信息类,公务员计算机科学与技术类包含哪些专业?
  5. 浏览器chrome如何查看页面的尺寸?调整控制台的位置?手机端的页面浏览?
  6. 什么是电缆,电缆的含义,电缆知识介绍
  7. C语言disc函数,【职场之道】DISC行为模式深入了解
  8. 判断三边是否能构成直角三角形
  9. await is a reserved word
  10. python转换字符编码_Python常见字符编码间的转换