为什么需要持久化?
Redis 是一种内存数据库,所有数据都是保存在内存中的,内存中的数据重启之后就会消失,所以为了重启或者意外退出之后能恢复之前的数据,Redis 实现了两种持久化机制
两种持久化机制
RDB
全名 Redis DataBase,默认开启的持久化机制
如果在指定的时间间隔内,执行了指定次数的写操作,则会触发RDB,将内存中的数据写入到磁盘中。即在指定目录下生成一个 dump.rdb 文件。Redis 重启会通过加载 dump.rdb 文件恢复数据。
dump.rdb 的存放路径在 redis 配置文件 redis.conf(默认路径:/etc/redis.conf
)中的 dir 字段指定(默认为:/var/lib/redis
)
两种触发方式:
- 手动:在 redis 的命令行中执行 save 或 bgsave
- save:会阻塞当前的 Redis 服务器,直到 RDB 执行完
- bgsave:会 fork 一个子进程来执行,只会阻塞一个执行 fork 的时间,很短
- 自动:在配置文件中设置让 Redis 每隔多长时间、数据量达到了多少,就自动开始 bgsave
# /etc/redis.conf 中 RDB 相关配置
save 900 1 # 每 15 分钟,只要有一个 key 变化了,就 bgsave
save 300 10 # 每 5 分钟,...十个 key ...
save 60 10000 # 每分钟,...一万个 key ...
bgsave 指令运作流程
AOF
全名 Append Only File,默认关闭
以独立日志的方式记录每次写命令,重启时再重新执行 AOF 文件中的命令达到恢复数据的目的,AOF 的主要作用是解决了数据持久化的实时性。
Redis 目前默认是不开启 AOF 的,若要开启,需要在配置文件中配置 appendonly yes
。
# /etc/redis.conf 中 AOF 相关配置
appendonly no # 是否开启 AOF,如果开启了,Redis 启动的时候就会优先加载AOF
appendfilename "appendonly.aof" # 文件名,在 `/var/lib/redis` 下
# 三种缓冲区同步策略
# appendfsync always # 命令写到缓冲区后就调用 fsync 同步到硬盘文件
appendfsync everysec # 由专门线程每秒钟 fsync 一次
# appendfsync no # 不调用 fsync,让操作系统决定什么时候同步,周期不可控,通常最长 30s
AOF 运作流程
AOF 重写机制
随着命令不断写入,文件会越来越大,这时就会进行重写,可以使 AOF 文件变小:
- 进程内已经超时的数据可以不再写入;
- 旧的 AOF 文件内含有无效的命令,比如某个 key 添加完又删除了,等同于两条无效命令;某个 key 的值多次修改 ,除了最后一次,其余的都为无效命令;
- 多条命令可以合并为一条,比如给链表、集合添加元素
AOF 重写降低了文件大小,加载效率也会更高。
重写触发方式
- 手动触发:调用
bgrewriteaof
命令 - 自动触发
触发的时机 = 当前AOF大小 > auto-aof-rewrite-min-size &&(当前AOF大小-上次重写后的大小)/上次重写后AOF的大小>=auto-aof-rewrite-percentage
# /etc/redis.conf 自动重写出发时机的配置项
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
重写运作流程
二者比较
比较 | RDB | AOF |
---|---|---|
效率 | 更高 | 更低 |
数据安全性 | 更低,分钟级别 | 更高,秒级或者实时 |
文件格式 | 压缩的二进制文件,有版本兼容性问题 | 文本格式,以日志方式记录每次写操作,可读性高,可以直接修改 |
文件大小 | 更小,加载快 | 更大,加载慢,不过有重写机制,使文件变小 |
同时开启怎么办
有 AOF 则加载 AOF,否则,加载 RDB