Redis-3 数据持久化

发布于:2024-05-09 ⋅ 阅读:(22) ⋅ 点赞:(0)

一.什么是数据持久化?

redis是把数据存储在内存中的,而采用DRAM芯片存储的内存会面临断电导致数据丢失的问题,因此我们可以将redis在内存中的数据存储一份到磁盘中,用于内存数据丢失时的恢复,这个过程就叫做数据持久化。

二.如何实现数据持久化?

redis中提供了两种数据持久化技术:RDB和AOF。

  • RDB

1.介绍:Redis Database Backup file,redis数据备份文件,又叫做redis数据快照。是指将redis中的数据都存储到磁盘中,当redis故障重启后,会从磁盘中读取备份数据用于恢复。RDB有主动备份和自动备份两种备份方式。

2.主动备份

(1)save:由redis主进程来执行RDB,会阻塞其他进程的执行。

(2)bgsave:fork主进程得到一个子进程,由子进程来执行RDB,能避免影响主进程的运行。

3.自动备份

在redis.conf文件中设置自动备份的频率。自动备份一定是用子进程来执行的。

4.bgsave的执行原理

(1)操作系统中进程是无法访问物理地址的,进程只能操作逻辑地址,又通过页表将逻辑地址与物理地址产生映射。

(2)使用bgsave时,会fork主进程得到一个子进程,这个子进程会获取到主进程的页表,通过这个页表子进程就能访问到缓存在内存中的数据,并将这些数据写入磁盘。

(3)主进程和子进程拥有相同的页表,相当于共享一块缓存内存。

5.copy-on-write

为了防止发生读写冲突,fork采用的是copy-on-write技术:

(1)fork的时候,会将共享内存部分标记为read-only

(2)主进程执行读操作的时候,直接访问共享内存读取

(3)主进程执行写操作的时候,会对共享内存的数据拷贝一份,同时主进程的页表也将修改,重新映射到这份拷贝数据上,后续主进程对于缓存中数据的读写都是对这份拷贝数据进行。而子进程执行RDB的对象仍然是原来的共享数据,这样就不会发生读写冲突。

  • AOF

1.介绍:Append Only File,追加文件。redis会将执行的所有写命令都记录在AOF中,AOF可以看作是redis写命令的日志文件。当redis故障重启后,只要重新执行一遍AOF中的写命令就能恢复数据。

2.AOF技术通过刷盘策略来控制写命令写入AOF的频率

(1)always:同步刷盘,每执行一次写命令,就记录到AOF。

(2)everysec:每秒刷盘,写命令执行完先放到缓冲区,每隔1秒就将缓冲区中的命令写入AOF。

(3)no:操作系统控制,写命令执行完先放到缓冲区,由操作系统来决定何时将缓冲区中的命令写入AOF。

3.bgrewriteaof命令

(1)在记录写命令时,有可能会出现对同一个key进行多次写操作而产生多条写命令,这些写命令只有最后一条才是有意义的,却会被全部写入AOF。

(2)通过bgrewriteaof命令可以让AOF执行重写功能,相当于把那些对同一个key执行的写命令都去除掉,只保留最后一次写命令,用最少的命令达到相同的效果。

三.RDB和AOF哪一种恢复更快?

(1)RDB恢复更快,因为RDB是使用二进制存储的,文件更小,因此恢复就更快。

(2)但是RDB会有数据丢失的风险,如果在RDB执行备份之前redis就发生故障,会导致数据全部丢失。

(3)因此实际中常使用AOF来恢复数据,虽然AOF恢复数据比RDB慢,但是丢失数据的风险要比RDB小。通过设置刷盘策略来达到数据保存和性能的平衡。

(4)如果是对数据安全性要求很高的项目,通常会将RDB和AOF结合使用。