redis夯实之路-持久化之RDB与AOF详解

数据库

初始化服务器时会根据redisServer的dbnum属性来决定创建多少个数据库,默认为16

使用select切换数据库

客服端状态redisClient结构的db属性记录了当前的目标数据库

RedisDb结构的dict字典保存了数据库的所有键值对,这个字典被称为键空间。

crud实际上是对键空间字典来操作,还有flushdb,dbsize等命令也是通过对键空间操作来实现的

设置键的生存时间或过期时间

Setex(单位s),expire(s),pexpire(ms)可以设置键的生存时间,

Expirate,pexpirate设置键的过期时间(timestamp的时间戳)

Ttl和pttl返回键的剩余生存时间

RedisDb结构的expires字典保存了数据库的所有键的过期时间,称为过期字典。键是指向键对象的指针,值是longlong类型的整数,一个ms精度的unix时间戳

Persist可以移除键的过期时间

判断过期键

如果过期字典存在键,unix时间戳大于过期时间,键已经过期

过期键删除策略:定时删除,惰性删除,定期删除

Redis使用的是惰性删除,定期删除两种策略,获取键时检查是否过期,周期性检查

RDB和AOF:

生成RDB文件时,过期键被忽视。

载入RDB文件时,如果是主服务器,会忽视;如果是从服务器,不会忽视

AOF写入时会追加一条del命令表示删除

AOF重写时,过期键被忽视。

复制:通过从服务器get过期键时不会删除,通过主服务器get过期键时会删除,并向从服务器发送del命令

数据库通知:2.8版本新增的功能,可以通过订阅给定的频道或模式,来获取数据库键的变化,以及命令的执行情况

RDB持久化和AOF持久化

使用RDB文件或AOF文件,可以还原数据库状态

RDB

Rdb通过保存数据库中键值对来记录数据库状态

Rdb文件是一个经过压缩的二进制文件

使用save或者bgsave生成RDB文件,save直接阻塞服务器,bgsave派生子进程创建RDB文件(bgsave命令执行期间禁用save,bgsave)

载入RDB文件服务器处于阻塞状态

自动间隔保存:可以设置服务器的save选项,让服务器每隔一段时间自动执行bgsave命令。RedisServer的saveparams属性保存了save设置的保存条件,还有dirty计数器记录了上一次成功执行save或bgsave命令后对数据库修改的次数,lastsave记录了上一次成功执行save或bgsave命令的unix时间戳

Save 900 1 表示900秒内至少对数据库进行一次修改

周期性操作函数serverCron默认每隔100ms执行一次,它的其中一项工作就是检查save选项中的保存条件是否满足,如果满足就执行bgsave命令

RDB文件结构

Redis表示为rdb文件,db_version时版本号,databases表示所有非空数据库,EOF表示rdb文件正文结束,check_sum为校验和

Pairs保存该数据库所有的键值对,包括过期时间

不同类型的键值对,以不同的方式保存在rdb文件中

分析rdb文件:同时以ascii和十六进制打印rdb文件

AOF

Aof通过保存resdis所执行的写命令来记录数据库状态

Aof文件中所有的命令都以redis命令请求协议的格式保存

Aof持久化功能的实现可分为命令追加(append),文件写入,文件同步(sync)三步

开启aof后写命令会追加到aof_buf缓冲区末尾

服务器进程就是一个事件循环,结束一个事件循环前会考虑是否将aof_buf缓冲区的内容放到aof文件中

Appendfsync选项默认为everysec

写入与同步:数据写入文件时,通常会先写入内存缓冲区中,缓存满了或者超过时限后,才会将缓冲区的数据写入磁盘

Redis会创建一个伪客户端进行aof文件的载入,服务器读取并执行aof中的写命令恢复数据库的状态

重写

通过读取数据库状态来重写aof文件可以减少文件体积

重写:子进程创建新的aof文件,读取当前数据库状态生成写命令写入aof文件,服务器会在重写时将新的写命令追加到aof缓冲区和aof重写缓冲区。重写完成后会将aof重写缓冲区的内容写入新aof文件中,然后将新aof文件改名,原子地替换新,旧aof文件。

redis默认采用RDB持久化

AOF文件更新比RDB快,AOF持久化功能开启时优先使用AOF文件还原数据库状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值