Redis RDB和AOF持久化

RDB持久化

1.什么是RDB持久化
RDB持久化是通过保存数据库中的键值对来记录数据库状态不同。RDB持久化可以手动执行,也可以根据服务器配置选项定期执行。
2.RDB文件的创建和载入
RDB文件的创建可以通过两种方式实现:手动执行、根据服务器配置选项定期执行。
1)手动执行:
RDB文件的生成命令:SAVE,BGSAVE.
SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止。在服务器进程阻塞期间,服务器不能处理任何命令请求。
BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。
2)根据服务器配置选项定期执行
可以在配置文件中通过save选项设置多个保存条件,但只要其中一个条件被满足,服务器就会执行BGSAVE命令:
#指定RDB文件名,用以备份数据到硬盘并区分不同redis
dbfilename "dump_6380.rdb"
#指定当前redis的根目录,用来存放RDB/AOF文件
dir "/home/redis/data"
save 900 1
save 300 10
save 60 10000
服务器在900秒之内,对数据库进行了至少1次修改;
服务器在300秒之内,对数据库进行了至少10次修改;
服务器在60秒之内,对数据库进行了至少10000次修改.
RDB文件的载入工作是在服务器启动时自动执行的,检测到RDB文件存在,就会自动载入RDB文件。
3.RDB文件结构
RDB文件的一个经过压缩的二进制文件,不能直接打开,可以通过命令od查看,比如od -c redis_6380.rdb
RDB文件结构:REDIS db_version databases EOF check_num
说明:
REDIS保存着‘REDIS’五个字符;
db_version记录了RDB文件的版本号;
databases包含着零个或多个数据库,以及各个数据库中的键值对数据;
EOF常量标识着RDB文件正文内容的结束;
check_num是一个无符号整数,保存在一个检验和,这个校验和是程序通过对前面4个部分进行计算得出的。

AOF持久化

1.什么是AOF持久化
AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库状态的。被写入AOF文件的所有命令(注意:只有命令能执行成功的才会被记录到日志中)都是以Redis的命令请求协议格式保存的,可以直接打开一个AOF文件,查看里面的内容。
2.AOF持久化的实现
AOF持久化的实现可以分为命令追加、文件写入、文件同步三个步骤。
服务器在执行完一个写命令之后,会以协议格式将被执行的写追加到服务器状态的aof_buf缓冲区的末尾。服务器稍后会调用flushAppendOnlyFile函数,考虑是否需要将aof_buf缓冲区中的内容写入和保存到AOF文件里面。具体判断条件需要由服务器配置的appendfsync选项的值来决定。
appendfsync选项值可为always,everysec,no:
always:每个写明了执行完,立马同步将日志写回磁盘;
everysec:每个写命令执行完,先把日志写到aof_buf缓冲区,每隔一秒把缓冲区中的内容写入磁盘;
no:每个写命令执行完,先把日志写到aof_buf缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。
3.AOF文件太大了怎么办
AOF文件太大存在什么问题?如果AOF文件太大,再往里面追加命令记录的话,效率会变低;发生宕机,恢复过程很慢,因为需要将AOF中记录的命令要一个个被重新执行。
针对文件太大,可以考虑AOF重写。
AOF重写:Redis服务器可以创建一个新的AOF文件来代替现有的AOF文件,新旧俩个AOF文件的体积通常会比旧AOF文件的体积要小的多。AOF文件重写,其实是通过读取服务器当前的数据库状态来实现的,并不需要对现有的AOF文件进行任何读取、分析或者写入操作。重写过程是由bgrewriteaof来完成的,这是为了避免阻塞主线程,导致数据库性能下降。
命令:BGREWRITEAOF
从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, BGREWRITEAOF 仅仅用于手动触发重写操作
4.潜在风险
1)数据丢失,如果刚执行完一个命令,还没有来得及记日志旧宕机了,那么这个命令和数据就会丢失;
2)AOF不会对当前命令阻塞,因为是写后记录日志,但是AOF日志是在主线程中执行的,不断将日志写入磁盘,磁盘写压力大,也会影响操作。
5.AOF日志文件的创建
在配置文件中进行如下设置:
appendonly yes
appendfsync everysec
#指定当前redis的根目录,用来存放RDB/AOF文件
dir "/home/redis/data"

AOF文件的更新频率比RDB文件的更新频率高,所以如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF持久化功能。
Redis4.0中提出了一个混合使用AOF日志和内存快照的方法:内存快照以一定的频率执行,在两次快照之间,使用AOF记录这期间的所有命令操作。

参考资料:《redis设计与实现》

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值