|NO.Z.00020|——————————|BigDataEnd|——|Hadoop&Redis.V02|——|Redis.v02|RDB机制|
一、RDB
### --- RDB
~~~ RDB(Redis DataBase),是redis默认的存储方式,
~~~ RDB方式是通过快照( snapshotting )完成的。
~~~ 这一刻的数据:不关注过程
### --- 触发快照的方式
~~~ 符合自定义配置的快照规则
~~~ 执行save或者bgsave命令
~~~ 执行flushall命令
~~~ 执行主从复制操作 (第一次)
### --- 配置参数定期执行
~~~ 在redis.conf中配置:save 多少秒内 数据变了多少
~~~ 漏斗设计 提供性能
[root@linux123 ~]# vim /opt/yanqi/servers/redis/bin/redis.conf
save "" # 不使用RDB存储 不能主从
save 900 1 # 表示15分钟(900秒钟)内至少1个键被更改则进行快照。
save 300 10 # 表示5分钟(300秒)内至少10个键被更改则进行快照。
save 60 10000 # 表示1分钟内至少10000个键被更改则进行快照。
### --- 命令显式触发:在客户端输入bgsave命令。
127.0.0.1:6379> bgsave
Background saving started
二、RDB执行流程(原理)

### --- RDB执行流程(原理)
~~~ # Redis父进程首先判断:
~~~ 当前是否在执行save,或bgsave/bgrewriteaof(aof文件重写命令)的子进程,
~~~ 如果在执行则bgsave命令直接返回。
~~~ # 父进程执行fork(调用OS函数复制主进程)
~~~ 操作创建子进程,这个复制过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令。
~~~ # 父进程fork后,
~~~ bgsave命令返回”Background saving started”信息并不再阻塞父进程,并可以响应其他命令。
~~~ # 子进程创建RDB文件,
~~~ 根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。(RDB始终完整)
~~~ # 子进程发送信号给父进程表示完成,
~~~ 父进程更新统计信息。
~~~ # 父进程fork子进程后,
~~~ 继续工作。
三、RDB文件结构

### --- RDB文件结构
~~~ 头部5字节固定为“REDIS”字符串
~~~ 4字节“RDB”版本号(不是Redis版本号),当前为9,填充后为0009
~~~ 辅助字段,以key-value的形式
字段名 | 字段值 | 字段名 | 字段值 |
redis-ver | 5.0.5 | aof-preamble | 是否开启aof |
redis-bits | 64/32 | repl-stream-db | 主从复制 |
ctime | 当前时间戳 | repl-id | 主从复制 |
used-mem | 使用内存 | repl-offset | 主从复制 |
### --- 字段说明
~~~ 存储数据库号码
~~~ 字典大小
~~~ 过期key
~~~ 主要数据,以key-value的形式存储
~~~ 结束标志
~~~ 校验和,就是看文件是否损坏,或者是否被修改。
四、可以用winhex打开dump.rdb文件查看。

### --- RDB的优缺点
~~~ # 优点
~~~ RDB是二进制压缩文件,占用空间小,便于传输(传给slaver)
~~~ 主进程fork子进程,可以最大化Redis性能,主进程不能太大,
~~~ Redis的数据量不能太大,复制过程中主进程阻塞
~~~ # 缺点
~~~ 不保证数据完整性,会丢失最后一次快照以后更改的所有数据
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv012-redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通