1、数据结构
redis实现自己的数据结构 SDS简单字符串,执行 set msg 'hello word' 会生成一个新的键值对,
SDS定义:
int len;//已用字符长长度
int free;//剩余字符串长度
char buf[];//字符数组 用于保存已有字符串
2、RDB
redis有两个命令 生成RDB文件,save 和 bgsave。RDB通过保存数据库中键值对来记录数据。
save为阻塞式生成RDB文件
bgsave会用一个子进程负责创建RDB文件。
RDB文件的载入是在 服务器启动时就进行,且AOF文件要先于RDB文件载入,并且AOF要优先于RDB。
在BGSAVE执行期间虽然redis服务器可以继续处理客户端请求,但在BGSAVE命令执行期间,服务器处理save bgsave bgrewriteaof命令和平时有区别。
期间 客户端的save命令会被拒绝,避免竞争条件。
同时 bgsave 和 bgrewriteaof也会被拒绝,原因同上。
bgsave和bgrewriteaof会在bgsave执行完成后运行。
在RDB文件载入时,服务器会一直处于阻塞状态,直至载入完成。
自动间隔保存:
BGSAVE在不阻塞服务器的情况下,通过配置save选项设置多个保存条件,只要任意条件满足即可执行bgsave命令。
如 save 900 1 900秒内对数据库至少修改了一次
save 600 10
可通过配置文件进行上述配置,如不设置服务器有默认配置。
redis服务器周期性函数servercron默认每100毫秒会扫描一次是否满足执行条件。
对于不同类型的键值对,RDB文件会使用不同的方式保存。
3、AOF
AOF通过保存服务器所执行的写命令来记录数据。
客户端--发送写命令--服务器--保存被执行的写命令--AOF文件
AOF持久化功能实现分为 命令追加append 、文件写入、文件同步sync三个步骤。
redis通过appendfsync命令设置同步机制:
appendfsync always 每次执行写入都会执行同步
appendfsync everysec 每秒执行
appendfsync no 跟随操作系统
AOF重写,redis会将多条类似命令整合成一条执行。它不是读取和分析现有AOF文件内容,而是直接从数据库读取状态,用一条命令代替AOF文件多条命令。
redis同时允许开启 RDB 和 AOF ,载入数据时会优先载入 AOF文件。