共计 1436 个字符,预计需要花费 4 分钟才能阅读完成。
Redis 的持久化存储
Redis 即使作为缓存,它也支持持久化存储。详细介绍可以参考官方文档:https://redis.io/docs/management/persistence。
为什么要持久化存储 ?
Redis 是基于内存实现的数据库,为了保证效率,所有的操作都是在内存中完成的。数据都是缓存在内存中,当你重启系统或关闭系统时,之前缓存在内存中的数据都会丢失并且无法找回。为了避免这种情况,Redis 就需要实现持久化存储将内存中的数据存储起来。
Redis 如何实现持久化存储?
从官方文档中可以了解到 Redis 提高了不同级别的持久化方式:
RDB
:根据指定的时间间隔对数据进行快照存储。AOF
:记录每次对 Redis 服务器的写操作,当服务器重启的时候会重新执行这些命令来恢复原始数据。AOF 命令以 Redis 协议追加保存每次写的操作到文件末尾。Redis 还能对 AOF 文件进行后台重写,使得 AOF 文件的体积不至于过大。No persistence
:禁用持久化存储。RDB + AOF
:在单个实例上组合使用 RDB 和 AOF。
RDB 实现持久化存储
Redis 中触发 RDB 持久化存储的方式有两种:手动触发
和自动触发
。
手动触发 RDB
手动触发对应 save 命令,会阻塞当前 Redis 服务器,直到 RDB 过程完成为止,对于内存比较大的实例会造成长时间阻塞,线上环境不建议使用。另外还有bgsave
命令,它会执行 fork 操作创建子进程,让子进程执行 RDB 避免对主进程造成影响。
> save # 主进程执行RDB,会阻塞其它命令
> bgsave # 开启一个子进程执行RDB,避免对主进程造成影响
自动触发 RDB
通过对redis.conf
配置文件进行配置,配置相关的save
命令。
> save seconds changes
xx 秒内数据修改 xx 次时自动触发 bgsave。
RDB 执行原理
bgsave 开始时会 fork 主进程得到子进程,子进程共享主进程的内存数据。完成 fork 后读取内存数据并写入 RDB 文件。
fork 采用的是copy-on-write技术
:
- 当主进程执行读操作,访问共享内存;
- 当主进程执行写操作,拷贝一份数据,执行写操作;
AOF 实现持久化存储
启动 AOF
AOF 默认是关闭的,需要修改redis.conf
配置文件来开启 AOF:
# 开启AOF功能
appendonly yes
# AOF文件名称
appendfilename 'appendfile.aof'
AOF 的命令记录的频率也可以通过redis.conf
配置文件进行配置:
# 每执行一次写命令,立即记录到AOF文件中
appendfsync always
# 写命令执行完先放入缓冲区,然后每隔1s将缓存区的数据写入到AOF文件,默认方案
appendfsync everysec
# 写命令执行完,先放入缓冲区,然后由操作系统决定何时将缓冲区的内容写入磁盘
同时命令记录一般采用追加的方式进行记录,但实际上 Redis 作为 K-V 的形式存储,只有最后一次的写操作才有意义,因此我们可以设置重写来避免记录过多的无效命令。
# 文件大小比上一次增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# 文件体积达到多大以上触发重写
auto-aof-rewrite-min-size 64mb
AOF 执行原理
AOF(Append Only File,追加文件)。Redis 的每一个写命令都会记录在 AOF 文件中,可以看作是命令日志。