REDIS持久化
RDB
redis中默认配置就是RDB,但是这种方式很容易出现数据不一致的问题
- 优点
- 这种方式适合大规模数据复原!
- 对于数据完整性不是特别高的情况下
- 缺点
- fork子进程的过程中是需要耗费非常大的资源的
- 如果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À^@ÿ}ûã?<Lª<9c>
rdb文件格式 这里在底层其实是一种二进制文件
- 触发操作
- 直接使用save指令,直接生成rdb文件
127.0.0.1:6379> save
OK
- 满足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
- 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文件损坏修复的操作理解
- 当你的aof未进行redis自动写入操作时,你对其中进行书写,对变量符号或者增加变量值,或者删除其中的操作理解,都是会使aof文件损坏的
set $2 jo $6 #这里我对之前值jocker添加了前置的值操作 sdflaksdfjklasdjfklajsd ds fkljasdlfjaldfjocker
-
如果你开启了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
-
使用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
我是一个热爱生活的程序员,欢迎关注我的频道:)