本篇文章会对Redis的持久化进行详解。主要涉及到的方面有:redis为什么需要持久化、redis怎么进行的持久化、持久化的方式都有哪些、每种持久化方式的优缺点是什么、持久化的流程进行展开详解。希望本篇文章会对你有所帮助。
文章目录
🙋♂️ 作者:@Ggggggtm 🙋♂️
👀 专栏:Redis 👀
💥 标题:Redis中的持久化详解💥
❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️
一、持久化简介
什么是持久化?简单理解,就是把数据保存到可以永久存放数据的介质中(通常是磁盘等硬件)。我们知道,在内存中的数据一旦进程出现问题或者掉电,那么数据就丢失了。为了防止一些重要的数据因突发情况而丢失,必不可少的就是对数据进行持久化操作。
一提到持久化,不知道你是不是能够想到Mysql事务的特性:原子性、一致性、持久性、隔离性。而这里的持久性实际上是和持久化是一个概念。Mysql是怎么做到持久化的呢?很简单,就是把数据保存在了磁盘上了。
但是Redis是一个内存数据库,是把数据存储在内存中的。那么一旦内存掉电或者进程异常终止,如果不对数据进行持久化保存,那么就会造成数据丢失。所以内存中的数据是不持久的!要想能够做到持久,就需要让redis把数据存储到硬盘上。什么??写硬盘???那不就和Mysql一样了吗?为了保证速度快和持久化,Reids做法是:内存中也存数据,硬盘上也存数据(既要也要)。理论上这两份数据应该完全相同的,但实际上是很难做到的。这就关系到Redis怎么去做持久化了。我们接着往下看。
二、Redis的持久化
在Redis中,当要插入一个新的数据的时候,就需要把这个数据同时写入到内存和硬盘。这样效率会不会很低呢?实际上Redis在写硬盘上有着自己的策略来保证整体的效率。当我们在查询数据的时候,还是直接从内存中读取。而硬盘上的数据只是Redis在启动时,用来回复内存中的数据使用的!
上述也提到了Redis在写硬盘上有着自己的策略来保证整体的效率,不同的策略也就是对应的不同的持久化方案!Redis 提供了两种主要的持久化方案:RDB(Redis DataBase)和 AOF(Append Only File)。
- RDB 持久化:RDB 持久化是通过创建快照来保存 Redis 数据库在某个时间点的状态。在redis重新启动时,加载快照的方式来实现数据恢复。
- AOF 持久化:AOF 持久化则是通过记录 Redis 服务器执行的所有写命令来保存数据库状态。在redis重新启动时,通过执行保存的命令来实现数据恢复。
先把两种方式的概念引出,下面我们再来慢慢体会两者细节与区别!
2、1 RDB
不知道大家有没有备份数据的习惯。试想一下:在备份数据时,我们可以选择每隔一段时间把我电脑硬盘上重要数据整体的备份到这个备份盘中(定期备份),也可以只要我更新过重要的数据就立即把这个学习资料往备份盘中拷贝一份(实时备份)。
RDB就是定期的把我们Redis内存中的所有数据,生成一个"快照",然后写入硬盘中。怎么理解这里的快照呢?数据“快照”可以理解为对某一时刻 Redis 数据库中的状态的一个完整“拍照”或“复制”。更具体地说,当触发 RDB 持久化操作时,Redis 会将当前内存中的数据库数据进行一次性的复制和序列化,将其以紧凑的二进制格式存储到磁盘上,形成一个.rdb 文件。这个.rdb 文件就是所谓的“快照”。打个比方,您可以想象 Redis 数据库是一个装满各种物品的房间,而生成 RDB 快照就像是快速地给这个房间里所有物品的摆放状态拍了一张照片,并且将这个照片(也就是.rdb 文件)保存了起来。之后,如果 Redis 数据库出现故障或者需要恢复数据,就可以依据这个“照片”(.rdb 文件)来还原当时数据库中的数据状态。
后续Redis 一旦重启了,内存数据就没了。就可以根据刚才的“快照"就能把内存中的数据给恢复出来!话又说回来,RDB是定期形成快照,但定期是指的什么时候形成快照呢?
2、2 RDB快照形成
2、2、1 触发方式
RDB快照的触发方式分为两种:手动触发和自动触发。手动触发分别对应save和 bgsave命令:
- save命令:阻塞当前Redis服务器,直到RDB过程完成为止,对于内存比较大的实例造成长时间阻塞,基本不采用。
- bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork阶段,一般时间很短。
Redis是单线程模型,如我们使用save命令形成快照,在此期间Redis会被阻塞住,造成Redis服务器不能够及时处理客户端的命令,进而造成一些列不好的影响。所以还是十分不推荐的。这对这种情况Redis怎么做的呢?是不是偷摸搞了个多线程啥的?并非如此!此处 redis使用的是"多进程"的方式来完成的并发编程。也就是上述的 bgsave 的实现~
自动触发可以在 Redis 的配置文件(redis.conf)中设置触发 RDB 持久化的条件。下文(对应小结:2、2、3)会讲解到。
2、2、2 快照形成原理
了解到快照形成是有多进程来实现的,具体的流程是什么的?我们看如下图: