本专栏开启,目的在于帮助大家更好的掌握学习Redis
,同时也是为了记录我自己学习Redis
的过程,将会从基础的数据类型开始记录,直到一些更多的应用,如缓存击穿还有分布式锁等。希望大家有问题也可以一起沟通,欢迎一起学习,对于专栏内容有错还望您可以及时指点,非常感谢大家 。
PS:
AOF
见专栏上文:Redis 持久化之 —— AOF
上一篇文章我们细讲了AOF
日志进行Redis
的持久化,今天我们讲另外一种方式——RDB
快照持久化,其全程为 Redis Backup file
(Redis
数据备份文件)。
快照这个东西,就是记录一瞬间,比如大家出去景区旅游就经常遇到一些帮忙拍快照的小贩。如果大家经常用虚拟机的话也应该知道,它里面就可以通过快照存储,当虚拟机崩的时候回到快照时的存储状态。而RDB
也是同理,它可以记录一瞬间的Redis
内存数据,记录的是实际的内存数据而非执行命令的日志,当需要恢复数据时,直接把dump.rdb
文件读入内存即可,所以RDB
的恢复效率要比AOF
快得多,它不需要去执行操作指令来恢复数据。
我们来学习一下RDB
究竟应该如何使用,Redis
提供了两个指令来主动生成RDB
文件,分别是save
和bgsave
。它们主要的区别在于是否由主线程来执行生成RDB
文件操作:
在Redis
的config
文件中我们也可以更改bgsave
命令的配置信息:
save 900 1
save 300 10
save 60 10000
下面表示禁用RDB
save ""
前面的指令表示,900
秒内至少用一个key
被修改,则执行bgsave
,第二个是300
秒内至少10
次修改则触发,第三条类似。注意虽然指令是写的save
,但其实执行的是bgsave
。
当然还有一些其他的配置也可以修改
是否压缩,建议不开启,压缩会更消耗CPU,磁盘不值钱
rdbcompression yes
RDB文件名称
dbfilename dump.rdb
RDB
的快照方式是全量快照, 会将「所有数据」都记录到磁盘中,显然这个操作是一个重量级的操作,是非常消耗资源。如果太频繁的进行快照,会对Redis
的性能造成极大影响,如果快照的间隔时间太长,一旦服务器宕机丢失的数据又会丢失大量的数据。所以设置多长时间进行一次bgsave
,需要我们根据应用的场景来自己平衡。
一般来说,bgsave
是不会阻塞主线程的,但其实fork
得到子进程这个操作是会阻塞主线程的(只不过这个操作很快),如果存在意外导致fork
执行太久,此时也是有可能阻塞主线程的。
除了上述我们讲的save
命令和bgsave
命令,还有一些情况Redis
也会自动触发快照
bgsave
flushall
命令清空服务器数据,生产环境慎用shutdown
命令关闭Redis
时,会执行save
无论是哪种方式进行快照,rdb
文件产生的过程如下:
rdb
文件,并写入数据rdb
文件rdb
文件 当Redis
服务器重新启动时,如果根目录存在文件 dump.rdb
,则Redis
会自动去加载恢复数据。如果没有dump.rdb
,我们需要手动将文件移动根目录下,是否成功加载RDB
文件我们在启动日志在查看。
PS:在
Redis
加载RDB
文件时,主线程处于阻塞状态
不难发现,虽然RDB
恢复数据比AOF
快很多,但其快照的频率很难把握。
在我们的Redis 4.0
后,提供了AOF
与RDB
的混用机制,也叫混合持久化。
开启混合持久化需要在config
文化中手动开启
改为 yes 开启混合持久化
aof-use-rdb-preamble yes
这样有什么好处呢?我们要知道,在子线程进行 bgsave
时,主线程仍然会执行其他客户端发来的命令,这时子线程快照存储的是原本的内存数据,所以就会导致数据不一致,想修改只能等下一次bgsave
的到来。
当开启混合持久化后,在AOF
重写日志时,fork
的子进程会先以RDB
的方式写入到AOF
文件中,在子进程工程时,主线程处理的命令会存储到重写缓冲区内,当子进程完成RDB
方式读入后,会再以AOF
方式把重写缓冲区的指令写入到AOF
文件中。
这样操作后,AOF
文件前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的 增量数据。
这样我们可以集成两者的优点,前半部分由于是RDB
所以加载很快,后半部分由于是AOF
,所以丢失的数据更少。
RDB | AOF | |
---|---|---|
持久化方式 | 定时对整个内存做快照 | 记录每一次执行的命令 |
数据完整性 | 不完整,两次快照之间会丢失数据 | 相对完整,取决于刷盘策略 |
文件大小 | 会有压缩,文件体积小 | 记录命令,文件体积大 |
宕机恢复速度 | 很快 | 慢 |
数据恢复优先级 | 低,因为数据完整性不如AOF | 高,数据完整性高 |
系统资源占用 | 高,大量CPU和内存消耗 | 低,主要是磁盘IO,但重写时占用CPU和大量资源 |
使用场景 | 可以容忍数分钟数据丢失,追求更快的启动速度 | 对数据安全性要求较高 |