一、今天分享啥?
redis持久化
二、准备从哪几个方面讲?
- 为啥需要持久化?
- 持久化功能
- 持久化策略有哪些?
- RDB持久化
- AOF持久化
- RDB与AOF比较
- RDB与AOF比较
三、为啥需要持久化?
所谓Redis持久化就是把数据保存到磁盘上
再说明【为啥需要持久化?】前,先假设一种未作持久化场景:redis里有10GB数据,突然停电或者意外宕机了,再启动的时候10GB都没了!!!
![c39b24a3e61e7d60ba661111d1b89195.png](https://i-blog.csdnimg.cn/blog_migrate/1597a43417033da9262d9edb58a6fe2c.png)
试想一下,持久化重要不?
简单来说持久化是为了保证redis数据不会因进程退出而丢失。
四、持久化策略有哪些?
- RDB(Redis DataBase):将当前数据保存到磁盘
- AOF(Append Only File):将每次执行的写命令保存到磁盘
五、RDB持久化
5.1 RDB概述
- RDB持久化是将当前进程中的数据生成快照保存到磁盘(快照持久化),保存的文件后缀为rdb
- 当redis重启时,可以读取快照文件恢复数据
RDB保存和恢复文件,如图1和图2所示:
![8e12066bb26fe11a135c9e8bd41919d6.png](https://i-blog.csdnimg.cn/blog_migrate/edc78954771487e2841624318009593c.png)
5.2 RDB文件触发方式
官网描述的确实生涩哈,这里的触发其实指的是生成RDB文件,也就是保存RDB数据的方式。
有两种(两个命令):
- save/bgsave(这种方式称为手动触发,也就是手动在命令行敲save或者bgsave命令)
- save m n(这种方式称为自动触发,指定当m秒内发生n次变化时,会触发bgsave)
5.2.1 save和bgsave
- save是同步命令(单车道),save命令会阻塞redis服务器的进程,直到RDB文件创建完,在该期间,redis不能处理任何的命令请求,这就是save命令最大的缺陷。
- bgsave是异步命令(多车道),与save命令不同的是,bgsave在生成RDB文件时,会派生出一个子进程,子进程负责创建RDB文件,在此期间,主进程和子进程是同时存在的,因此不会阻塞redis服务器进程。(可用
lastsave
命令查看生成RDB文件是否成功)
save与bgsave对比:
命令 | save | bgsave |
---|---|---|
IO类型 | 同步 | 异步 |
是否阻塞redis其它命令 | 是 | 否 |
复杂度 | O(n) | O(n) |
优点 | 不会消耗额外内存 | 不阻塞客户端命令 |
缺点 | 阻塞客户端命令 | 需要fork子进程,消耗内存 |
5.2.2 save m n
该命令可自动保存RDB文件,除了特殊情况外,我们一般是不会直接使用命令来生成RDB文件的,redis提供了自动生成RDB文件的功能。redis提供了使用配置文件配置的方式每隔一段时间自动执行一次bgsave命令,配置在redis.conf中,例如下面三条命令,只要满足了一个,bgsave就会被执行:
save 900 1
save 300 10
save 60 10000
含义:
Redis 服务器在 900 秒之内,对数据库进