目录
数据库
redis服务器所有数据库保存在redisserver.db数组中,数据库数量由redisServer.dbnum属性保存.
数据库主要由dict和expires两个字典保存,dict保存键值对,expires字典负责保存键的过期时间.过期时间是一个以毫秒为单位的unix时间戳.
1 | typedef struct redisDb { |
过期键
过期键的删除策略
- 定时删除:设置键过期时间的同时,创建一个定时器(timer),定时器在键过期时间来临时,立即执行删除操作.对cpu不友好.
- 惰性删除:放任过期键不管,每次从键空间获取键,都检查是否过期,如果过期则删除,未过期则返回.对内存不友好
- 定期删除:每隔一段时间,程序对数据库进行一次检查,删除里面的过期键.
- redis服务器使用的是惰性删除+定期删除两种策略.
rdb对过期键的处理
- 主服务器模式下,程序对键检查,未过期的载入,过期的忽略
- 从服务器模式下,无论是否过期都载入,不过主从服务器在进行数据同步的时候,从数据库会被情况,所以过期键对载入rdb文件的从服务器也不会造成影响
aof文件写入
aof模式持久化数据,如果某个键没有被惰性删除或者定期删除,aof不会因为这个键产生任何影响,当过期或被惰性删除后,会向aof追加一个del命令.
aof重写
过期的不会被保存到重写后的aof文件.
复制
从服务器过期键动作由主服务器控制.
- 主服务器删除一个key,会显示向从服务器发送del命令
- 从服务器在执行碰到过期key也不会删除.
- 从服务器只有在加收到主服务器发送来的del后才会删除过期key.
数据库通知
键空间通知(key-space notification)
:某个键执行了什么命令的通知.键事件通知(key-event notification)
:某个命令被什么键执行了.
配置:notify-keyspace-eventes
(参数看配置文件说明即可)
备份与恢复
rdb
- 文件创建
- save:会阻塞redis服务进程.
- bgsave:fork出一个子进程去执行save.客户端发送的save,bgsave会被拒绝,bgrewriteaof和bgsave不能同时执行
- 文件载入:启动的时候自动加载.reload函数
aof
aof持久化的实现
- 命令追加
- 文件写入
- 文件同步
aof的载入(redis读取aof文件还原的流程):
首先服务器启动载入程序
- 创建一个不带网络链接的伪客户端,因为redis命令只能在客户端上下文执行.
- 从aof文件分析并读取一条写命令
- 为哭护短执行被读出的写命令
- 一直执行,直到aof文件结束.
aof重写
命令:bgrewriteaof,fork子进程进行aof文件重写,会同时向新老两个aof文件的缓冲区追加.