redis持久化
作者:互联网
一、RDB
RDB持久化通过保存数据库中的键值对记录服务器状态。
1、生成RDB文件
两个命令用于生成RDB文件,一个是SAVE,一个是BGSAVE。
两者区别:
1) SAVE命令会阻塞redis服务器进程,直到RDB文件创建完毕为止
调用函数:
def SAVE():
rdbSave()
2) BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求。
调用函数:
def BGSAVE():
pid=fork()
if pid==0:
rdbSave()
signal_parent() //完成后向父进程发送信号
else pid > 0:
handle_request_and_wait_signal() //父进程继续处理命令请求毛病通过轮训等待子进程的信号
else:
handle_fork_error() //处理出错情况
注意:
1、因为AOF文件更新频率通常比RDB文件的更新频率搞,所以
1)如果服务器开启了AOF持久化功能,那么服务器优先使用AOF文件还原数据库状态。
2)只有AOF持久化功能处于关闭时,服务器才会使用RDB文件来还原数据库状态。
2、考虑到性能方面,SAVE、BGSAVE、BGREWRITEAOF三个命令无法同时存在。
2、自动间隔性保存
因为BGSAVE不会阻塞服务器进程,因此允许用户设置服务器配置的save选项(可以设置多个),让服务器在满足选项条件的情况下(只需满足一条即可),每隔一段时间自动执行一次BGSAVE命令。
例如:
save 900 1
save 300 10
服务器在900秒之内,对数据库进行至少1次修改(包括写入、删除、更新等操作),则BGSAVE命令会被执行。
服务器在300秒之内,对数据库进行至少10次修改,则BGSAVE命令会被执行。
dirty计数器和lastsave属性
dirty计数器:距离上次成功执行SAVE或者BGSAVE命令之后,成功的修改次数
lastsave属性:UNIX时间戳,记录上一次服务器成功执行SAVE或者BGSAVE命令的时间
3、RDB文件结构
REDIS | db_version | databases | EOF | check_sum |
REDIS:
RDB文件最开头是REDIS部分,这部分长度为5字节,保存着‘REDIS’五个字符。在程序载入文件时,可以通过该字符检查文件是否为RDB文件。
注意:RDB文件保存的是二进制数据,不是C字符串。
db_version:4字节,字符串表示的整数,记录RDB文件的版本号。
databases:包含零个或任意多个数据库,以及数据库中的键值对数据。
databases结构:
SELECTDB | db_number | key_value_pairs |
key_value_pairs结构(不带过期时间):
TYPE | key | value |
value:保存了一个值对象,每个值对象类型由与之对应的TYPE记录,可以是:字符串对象、列表对象、哈希对象、集合对象、有序集合对象。
EOF:1字节,标志RDB文件正文结束。
check_sum:8字节长无符号整数,保持着一个校验和。
打印RDB文件:
$ od -cx dum.rdb
以ASCII编码和十进制打印RDB文件
二、AOF
AOF持久化通过保存Redis服务器所执行的写命令来记录服务器状态,即将服务器执行的SET、SADD、RPUSH等命令保存到AOF文件中。
被写入AOF文件的所有命令都是以redis的命令请求协议格式保存。
1、AOF持久化实现
命令追加、文件写入、文件同步
1)命令追加
服务器执行完一个写命令后,会以协议格式将被执行的谢明丽追加到服务器状态的aof_buf缓冲区的末尾
2)文件写入和同步
appendfsync选项:
always / eveysqc / no: eveysqc:每次都将aof缓冲区中的所有内容写入到AOF文件,并且每隔一秒就要在子线程中对AOF文件进行一次同步。
2、AOF文件的载入和数据还原
1)创建一个不带网络连接的伪客户端
2)从AOF文件中分析并读取一条写命令
3)使用伪客户端执行被读出的写命令
4)一直执行步骤2和步骤3,直到文件中的所有写命令被处理完毕。
3、AOF重写(BGREWRITEAOF命令)
1)意义和实现
为了解决AOF文件体积膨胀问题,redis提供了AOF文件重写功能,服务器可以创建一个新的AOF文件来替代现有的AOF文件。
注意:AOF文件重写并不需要对现有的AOF文件进行任何读取、分析或者写入操作,这个功能是通过读取服务器当前的数据库状态来实现。
另外,如果集合带有多个元素的键时,会检查所包含的元素数量,如果超过了规定值,重写程序将使用多条命令来记录键的值,而不只是一条。
2)AOF后台重写
AOF重写程序调用aof_rewrite函数来完成创建一个新AOF文件的任务,因此这个函数会进行大量的写入操作,调用这个函数的线程将被长时间阻塞,所以AOF重写
程序会放到子进程执行。
在子进程执行AOF重写期间,服务器进程执行三个工作
1、执行客户端发来的命令
2、将执行后的写命令追加到AOF缓存区
3、将执行后的写命令追加到AOF重写缓冲区。
标签:文件,持久,AOF,BGSAVE,redis,命令,RDB,服务器 来源: https://www.cnblogs.com/socks/p/16083207.html