Redis源码解析:持久化相关

RDB

Redis源码解析:持久化相关_第1张图片

触发机制 特点
save(手动触发) 阻塞当前服务器,直到RDB文件生成
bgsave(手动触发) fork创建子进程,由子进程完成RDB持久化,阻塞只发生在fork阶段,时间很短
配置文件(自动触发) save seconds changes,例如save 900 1
主从复制(自动触发) 从节点执行全量复制,主节点调用bgsave生成rdb文件,发送给从节点

redis.conf

# 900秒内执行一次set操作 则持久化1次  
save 900 1

# 300秒内执行10次set操作,则持久化1次
save 300 10

# 60秒内执行10000次set操作,则持久化1次
save 60 10000
# 清空redis服务器的所有数据
./redis-cli flushall

# 登陆redis
./redis-clit
127.0.0.1:6379> set testKey testValue
OK
127.0.0.1:6379> save
OK
127.0.0.1:6379>
save

查看生成的rdb文件,是一个二进制文件

od -A x -t x1c -v dump.rdb

Redis源码解析:持久化相关_第2张图片
命令显示的结果中第一行是用十六进制显示的dump.rdb文件的内容,第二行是每个字节对应的ascii字符,后面的行以此类推

rdb文件的详细格式就不分析了,简单介绍一下标红的地方
redis为魔数,0009为rdb版本,FF为rdb文件结束符号,FF后面的内容为rdb文件的crc64校验码

rdb文件的大概组成如下所示
Redis源码解析:持久化相关_第3张图片

AOF

Redis源码解析:持久化相关_第4张图片

# 执行的命令
set testKey testValue

# 协议内容
*3\r\n$3\r\nset\r\n$7\r\ntestKey\r\n$9\r\ntestValue\r\n

混合持久化

当aof-use-rdb-preamble值为yes时,在aof重写的阶段

aof-use-rdb-preamble yes

测试

开启aof

redis.conf

# 是否开启 aof
appendonly yes

# aof 文件名
appendfilename "appendonly.aof"

# aof文件持久化策略,可选值为always,everysec,no
appendfsync everysec

# 是否开启 aof 文件重写
no-appendfsync-on-rewrite no

# aof 重写策略
# 超过上次 aof 文件的百分比后才进行持久化操作
auto-aof-rewrite-percentage 100
# 执行 aof 重写时,文件要达到的最小大小
auto-aof-rewrite-min-size 64mb

执行如下2个命令后

set testKey testValue
lpush list 1 2 3

appendonly.aof中的内容如下(直接把协议内容追加到appendonly.aof文件中)

*2
$6
SELECT
$1
0
*3
$3
set
$7
testKey
$9
testValue
*5
$5
lpush
$4
list
$1
1
$1
2
$1
3

参考博客

[1]https://juejin.cn/post/6844904089722028045
[2]https://zhuanlan.zhihu.com/p/340082703
aof源码
[3]https://blog.csdn.net/bruce128/article/details/104579288
aof重写
[4]https://blog.csdn.net/hezhiqiang1314/article/details/69396887

你可能感兴趣的:(Redis,redis)