概念介绍
RDB是Redis用来进行持久化的一种方式,是把当前内存中的数据集快照写入磁盘,也就是 Snapshot 快照(数据库中所有键值对数据)。恢复时是将快照文件直接读到内存里。
AOF(Append Only File)持久化: AOF持久化是通过保存Redis所执行的写命令来记录数据库状态的。
数据结构
redis数据库的结构如下
struct redisServer {
// ...
//
一个数组,保存着服务器中的所有数据库
redisDb *db;
// ...
}
多个数据库之间可以使用select切换,使用时需要注意数据库选择的正确性
键空间
Redis是一个键值对(key-value pair)数据库服务器,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间(key space):
typedef struct redisDb {
// ...
//
数据库键空间,保存着数据库中的所有键值对
dict *dict;
// ...
} redisDb;
过期时间
redis键过期有三种策略
- 定时策略: 在设置key时创建定时器,以CPU牺牲来保障内存高可用
- 惰性策略:访问键值时判断是否过期,过期则删除,以牺牲内存来保障CPU高可用
- 定期策略:服务器整体定时器,该策略是前两种的折中
rdb
开启rdb的主服务器只加载未过期键,从服务器加载所有键值
aof
在在文件写入`删除、重写时各不相同
内存淘汰机制
在内存耗尽了会走内存淘汰机制。redis 内存淘汰机制有以下几个:
- noeviction: 当内存不足以容纳新写入数据时,新写入操作会报错。
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key。
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 key。
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 key。
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 key。
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 key 优先移除。
SAVE、BGSAVE、BGREWRITEAOF
- SAVE、BGSAVE存在冲突,任意一个执行,另外一个命令请求会被直接禁止
- BGREWRITEAOF和BGSAVE 为保证性能问题,禁止同时执行
- SAVE 堵塞线程的然后执行持久化
- BGSAVE 创建子线程持久化
自动间隔保存
redis 后台配置
save 90 1
save 1000 60
第一条配置表示 1秒钟内如果发生90次键值变化,那么自动调用BGSAVE持久化数据。
第二条配置表示 60秒钟内如果发生1000次键值变化,那么自动调用BGSAVE持久化数据
计数器
dirty计数器记录距离上一次成功执行SAVE命令或者BGSAVE命令之后,服务器对数据库状态(服务器中的所有数据库)进行了多少次修改(包括写入、删除、更新等操作)。
lastsave属性是一个UNIX时间戳,记录了服务器上一次成功执行SAVE命令或者BGSAVE命令的时间。
数据加载流程
![](https://img.haomeiwen.com/i4920613/db49e13d700c0030.png)
持久化
redis两种持久化方式,rdb、aof。
rdb支持自动定期保存,使用save配置可实现。
aof支持可重新操作,可重写是指redis命令太多时,记录命令操作历史太过于浪费空间。通过把redis当前的数据重新写入。
网友评论