Redis 的持久化存储

259次阅读
没有评论

共计 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 文件。

Redis 的持久化存储

 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 文件中,可以看作是命令日志。

RDB 与 AOF 的优缺点

Redis 的持久化存储

正文完
 
PG Thinker
版权声明:本站原创文章,由 PG Thinker 2024-01-30发表,共计1436字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
热评文章
Rust中所有权与借用规则概述

Rust中所有权与借用规则概述

在GC与手动管理内存之间,Rust选择了第三种:所有权机制...