redis持久化

REDIS持久化

RDB

redis中默认配置就是RDB,但是这种方式很容易出现数据不一致的问题

  • 优点
    1. 这种方式适合大规模数据复原!
    2. 对于数据完整性不是特别高的情况下
  • 缺点
    1. fork子进程的过程中是需要耗费非常大的资源的
    2. 如果redis最后一次写入的时候宕机,那么最新的数据持久化传入就会失效

这种方式需要一次性遍历所有数据,并且不适合高频执行

REDIS DATABASE

  • redis是内存数据库,他的特性是如果数据暂存在其数据库中,但是内存数据库性质决定了其必定会产生断电即失去,宕机即失去,出现特殊情况,进程退出会失去的情况,所以在这种情形下面,将redis中的数据持久化储存在本地显得尤为重要了

在这里插入图片描述

  • RDB操作其实就是在一段时间内在数据库进行写入操作,在写入操作的过程之中创建一个子进程对你所写入的数据进行记录,然后创建一个临时的rdb文件,你如果写入完毕之后结束将临时的rdb文件写入到实际外存之中,实现持久化操作理解

redis默认的情况就是rdb,他的效率是非常高的,主要是不需要资源切换操作也不需要进行io操作,如果出现大规模数据需要恢复的情况,并且数据不是特别敏感的情况下,使用rdb是要比aof高效的

其实就好像是快照功能,保存一定时间间隔的状态

rdb保存的文件名称是 dump.rdb(需要备份)

REDIS0010ú      redis-ver^E7.0.9ú
redis-bitsÀ@ú^EctimeÂ<98>Á+dú^Hused-memÂ(`^M^@ú^Haof-baseÀ^@ÿ}ûã?<<9c>

rdb文件格式 这里在底层其实是一种二进制文件

  • 触发操作
  1. 直接使用save指令,直接生成rdb文件
127.0.0.1:6379> save
OK
  1. 满足sava条件的操作,列如60s内传入限定指令的值信息
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set v1 jack
OK
127.0.0.1:6379> set v2 queen
OK
127.0.0.1:6379> set v3 king
OK
127.0.0.1:6379> set v4 ace
OK
127.0.0.1:6379> set v5 master
OK
127.0.0.1:6379> exit
  1. redisshutdown操作理解,直接将数据库宕机
127.0.0.1:6379> shutdown
not connected> 
not connected> exit
[root@dongqing1012 bin]# ls
dump.rdb  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redisconfig  redis-sentinel  redis-server
  • 获取对应redis配置文件目录
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/bin"
  • rdb周期备份时间

    • save 900 1    #900秒内(十五分钟)有一个写入
      save 300 10   #300s内(五分钟)有十个写入
      save 60 100000   #60S内(一分钟)有100000个写入
      
      • 使用快照的条件配置文件位置
      ################################ SNAPSHOTTING  ################################
      
      # Save the DB to disk.
      #
      # save <seconds> <changes> [<seconds> <changes> ...]
      #
      # Redis will save the DB if the given number of seconds elapsed and it
      # surpassed the given number of write operations against the DB.
      #
      # Snapshotting can be completely disabled with a single empty string argument
      # as in following example:
      #
      # save ""
        此处进行操作#
      
      
  • 为什么会出现这样的情况?
    那是因为rdb操作都是以分钟数来进行操作的,实际并发场景下,数据的响应以及传输是非常快的,都是以秒或者毫秒来进行计算的

如果这里rdb使用分钟来进行操作,会产生数据不一致的问题,如何解决数据不一致的问题呢?

在这里插入图片描述

AOF

APPEND ONLY FILE

在这里插入图片描述

是一种以独立日志形式添加的理解操作

  • 触发
  • 如下是conf的源配置文件,还是需要理解其中的操作
  • 一般情况下面还是不建议进行aof进行使用的,因为aof一般是使用io操作,中间会非常消耗电脑的cpu资源的,所以redis默认的模式是非aof,大多数情况rdb是够用的,aof始终只是锦上添花
# By default Redis asynchronously dumps the dataset on disk. This mode is
# good enough in many applications, but an issue with the Redis process or
# a power outage may result into a few minutes of writes lost (depending on
# the configured save points).
#
# The Append Only File is an alternative persistence mode that provides
# much better durability. For instance using the default data fsync policy
# (see later in the config file) Redis can lose just one second of writes in a
# dramatic event like a server power outage, or a single write if something
# wrong with the Redis process itself happens, but the operating system is
# still running correctly.
#
# AOF and RDB persistence can be enabled at the same time without problems.
# If the AOF is enabled on startup Redis will load the AOF, that is the file
# with the better durability guarantees.
#
# Please check https://redis.io/topics/persistence for more information.

# 一般这里是默认设置no
appendonly yes

# The base name of the append only file.
#
# Redis 7 and newer use a set of append-only files to persist the dataset
# and changes applied to it. There are two basic types of files in use:
#
# - Base files, which are a snapshot representing the complete state of the
#   dataset at the time the file was created. Base files can be either in
#   the form of RDB (binary serialized) or AOF (textual commands).
# - Incremental files, which contain additional commands that were applied
#   to the dataset following the previous file.
#
# In addition, manifest files are used to track the files and the order in
# which they were created and should be applied.
#
# Append-only file names are created by Redis following a specific pattern.
# The file name's prefix is based on the 'appendfilename' configuration
# parameter, followed by additional information about the sequence and type.
#
# For example, if appendfilename is set to appendonly.aof, the following file

  • 每一秒进行一次写入操作,如何实现非常必要!每次进行写入操作的时候出现了一种非常特殊的理解操作,将指令转换到aof文件中

    这里是aof文件的结构,其中储存了你对于数据库添加键值的指令

    *2
    $6
    SELECT
    $1
    0
    *3
    $3
    set
    $2
    k1
    $4
    jack
    *2
    $6
    SELECT
    $1
    0
    *1
    $7
    flushdb
    *1
    $8
    flushall
    *3
    $3
    set
    $1
    j
    $4
    jack
    *3
    $3
    set
    $2
    q
    $5
    queen
    
    

    这里最新版的redis是通过目录中写入aof文件的操作的

    [root@dongqing1012 bin]# ls
    appendonlydir  dump.rdb  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redisconfig  redis-sentinel  redis-server
    [root@dongqing1012 bin]# cd appendonlydir/
    [root@dongqing1012 appendonlydir]# ls
    appendonly.aof.1.base.rdb  appendonly.aof.1.incr.aof  appendonly.aof.manifest
    # 通过查看这里的文件来对其中的写入指令进行操作
    [root@dongqing1012 appendonlydir]# vim appendonly.aof.1.incr.aof 
    您在 /var/spool/mail/root 中有新邮件
    
    
    关于aof文件损坏修复的操作理解
    1. 当你的aof未进行redis自动写入操作时,你对其中进行书写,对变量符号或者增加变量值,或者删除其中的操作理解,都是会使aof文件损坏的
    set
    $2
    jo
    $6
    #这里我对之前值jocker添加了前置的值操作
    sdflaksdfjklasdjfklajsd ds fkljasdlfjaldfjocker
    
    
    1. 如果你开启了aof模式,redis重新启动将会报错,那么解决这种方式就需要你进行文件修复

      这里有一些小的tips:就是你修改了aof文件后还是需要重启数据库,要不然会无法进行数据文件的传输检测,也就是你修改了之后还是可以启动redis并且不会报错

      [root@dongqing1012 bin]# redis-server redisconfig/redis.conf 
      [root@dongqing1012 bin]# redis-cli
      Could not connect to Redis at 127.0.0.1:6379: Connection refused
      not connected> exit
      
    2. 使用bin目录下面的 redis-check-aof --fix 这个指令会将出错的地方的指令直接删去,保证前面部分正确的指令代码始终正确且不受影响

      [root@dongqing1012 bin]# redis-check-aof --fix appendonlydir/appendonly.aof.1.incr.aof 
      Start checking Old-Style AOF
      0x              9f: Expected \r\n, got: 0a24
      AOF analyzed: filename=appendonlydir/appendonly.aof.1.incr.aof, size=306, ok_up_to=142, ok_up_to_line=35, diff=164
      This will shrink the AOF appendonlydir/appendonly.aof.1.incr.aof from 306 bytes, with 164 bytes, to 142 bytes
      Continue? [y/N]: y
      Successfully truncated AOF appendonlydir/appendonly.aof.1.incr.aof
      
      
      • 如下,你可以看出其中aof文件的细节变化,不做赘述了
      *2
      $6
      SELECT
      $1
      0
      *3
      $3
      set
      $2
      k1
      $4
      jack
      *2
      $6
      SELECT
      $1
      0
      *1
      $7
      flushdb
      *1
      $8
      flushall
      *3
      $3
      set
      $1
      j
      $4
      jack
      
      
关于aof的写入规则
# appendfsync always 总是进行写入(效率最低)
appendfsync everysec #每秒进行写入(效率中等)
# appendfsync no 从不进行写入(效率是最高的)
  • 其实对于aof来说,是可以和mysql中脚本文件进行类比理解的,他是通过将指令集合在一个文件之中来进行理解操作,你在写入的过程之中对你写的指令进行一种集合理解操作,这里的实现时间单位是s,这也就意味着如果出现特殊情况,失去的数据一般只会是一两秒的数据指令,整体框架还是存在的,这和edb整体遍历来说,数据完整性就比较好了
  • 并且redis中实现了一种缓冲区机制,aof_buf缓冲区,也就是将你所书写的指令先暂时存入缓冲区中,等待你写入完成之后,自动将你所书写的指令传入到固定的aof文件之中,那虚拟文件和缓冲区的概率还是需要明确的
aof重写规则
  • 但是对于指令append来说,如果不进行筛选或者进行优化存入文件的话,会出现aof文件中大量重复且冗余的代码出现,这会导致aof的文件变得十分的大,对于硬盘来说空间利用就比较低了
    • 所以说aof实现了一种重写机制,在文件写入的过程中,同时创建一个子进程,子进程与父进程同时对指令进行记录,如果父进程的指令出现了异常,对于后续关系型数据库就可以发现两个文件之间的区别,这里也是使用了虚拟文件技术来进行实现
    • 重写机制就是一种瘦身,是一种效率的提升
    • 子进程也实现了内部缓冲区的操作,这里的缓冲区叫做aof_write_bf aof重写缓冲区,如果出现任何数据库宕机操作或者重启操作,自动读取缓冲区的文件

在这里插入图片描述
在这里插入图片描述

资料来源: 【趣话Redis第二弹】Redis数据持久化AOF和RDB原理一次搞懂!_哔哩哔哩_bilibili
我是一个热爱生活的程序员,欢迎关注我的频道:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值