Redis如何实现持久化(AOF、RDB、混合模式)的优缺点

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: Redis如何实现数据不丢失Redis的读写操作都是在内存中,所以Redis性能才会高,但是当Redis重启后,内存中的数据就会丢失,那为了保存内存中的数据不会丢失,Redis实现了数据持久化机制,会把数据保存到磁盘,这样Redis重启就能够从磁盘恢复原有的数据

Redis如何实现数据不丢失


Redis的读写操作都是在内存中,所以Redis性能才会高,但是当Redis重启后,内存中的数据就会丢失,那为了保存内存中的数据不会丢失,Redis实现了数据持久化机制,会把数据保存到磁盘,这样Redis重启就能够从磁盘恢复原有的数据

Redis提供了三种数据持久化方式

AOF日志:每执行一条写操作命令就把该命令以追加的方式写入一个文件里

RDB快照:将某一时刻的内存数据以二进制的方式写入磁盘

混合持久化:集成了AOF与RDB的优点


AOF


AOF步骤

Redis在执行完一条命令后就会把该命令以追加的方式写到一个文件,然后Redis重启时,会读取该命令然后逐一执行命令的方式来进行数据恢复134afa3dbfc347a0aeea66e5c560e653.png

why先执行命令后写入磁盘?

避免额外的检查开销:因为如果先将写操作记录到AOF日志中,再执行该命令的话,如果当前命令有问题如果不检查的话,Redis使用该命令进行恢复的时候就可能会出错

不会阻塞当前写操作命令的执行:因为是在当前线程的写操作之后

  • 数据可能会丢失:当前线程执行完命令而还没有写入磁盘时就宕机了
  • 可能阻塞其它操作:因为记录AOF日志也是在主线程中执行,所以当Redis把日志写入磁盘时会阻塞后续的命令

AOF的写回策略

Always:每次写操作命令都会执行完后,同步AOF日志数据写回硬盘

Everysec:每次写操作命令执行完后,先写入AOF日志缓冲区,每秒写回磁盘

No:不由Redis控制写回磁盘,每次都写入AOF日志缓冲区,再由操作系统决定何时写回磁盘

27c09236c66d461ea1e16e0aebb80d61.png

AOF日志文件过大怎么办?


AOF日志是一个文件,随着写命令的执行,文件会越来越大,如果文件过大就会带来性能问题,比如AOF恢复中执行的命令就会很多就会导致恢复过程很慢

所以Redis提供了AOF重写机制,当AOF文件大小超过设定的阈值时AOF就会启用重写机制来压缩AOF文件,比如set name lixiaobo 与set name lidabo 就会设置为一条指令set name lidabo


重写AOF日志过程


Redis的重写AOF过程是由后台子进程bgwriteaof来完成的,这么做的好处:


1、子进程进行AOF重写期间,主进程可以继续处理命令请求,从而避免阻塞主进程

2、子进程带有父进程的数据副本,之所以不使用多线程是因为多线程会共享内存那么修改时候就需要加锁来保证数据安全而这样就会降低性能。而使用子进程,创建子进程时候父子进程是共享内存数据,而当父子进程任意一方修改就会发生写时复制


触发重写机制后,主进程会创建重写AOF的子进程,此时子进程只会对这个内存进行只读,重写AOF子进程会读取所有指令,并逐一把内存数据的键值对转换成另一条命令,再将命令记录到重写日志(新的AOF文件)

但是重写过程中,主进程依然可以正常处理命令,所以就出现了问题,如果主进程修改了已经存在的key-value,那么就会发生写时复制,此时这个key-value数据在子进程的内存数据就与主进程的内存数据不一样了

为了解决这种数据不一致,Redis设置了一个AOF重写缓冲区,这个缓冲区在创建bgwriteaof子进程之后开始使用

在重写AOF期间,当Redis执行完一个写命令之后,它会同时把这个写命令放入AOF缓冲区与AOF重写缓冲区

也就是说在bgwriteaof期间,主进程需要执行三个工作


1、 执行客户端发来的命令

2、将执行后的命令写入AOF缓冲区

3、将执行后的命令写入AOF重写缓冲区


当子进程重写完成之后会向主进程发送一条信号,信号是进程间通信的一种方式

主进程收到该信号后,会调用一个信号处理函数


1、将AOF重写缓冲区中的所有内容追加到新的AOF文件中,使得新旧两个AOF所保存的数据一致

2、新的AOF的文件进行改名,覆盖现有的AOF文件


442937bc9f6b4b3fad68ff93403d1349.png


RDB


RDB记录的是某一个瞬间的内存数据,记录的是实际数据,因此在数据恢复时,RDB恢复数据的效率比AOF高些

如何进行RDB

redis提供了两个命令来执行RDB

save:执行save会在主线程生成RDB文件,所以会阻塞主线程

bgsave:创建一个子进程来生成RDB文件,避免阻塞主线程


Redis的快照是全量快照,也就是每次执行快照都会把内存中的数据都记录到磁盘,所以这是一个比较重的操作


RDB执行快照时候数据能修改?


可以修改,在执行bgsave过程,Redis依旧可以继续处理操作命令,也就是数据是能被修改,关键技术还是写时复制


混合持久化


混合持久化步骤

AOF的优点是丢失数据少,但是数据恢复慢,而RDB是优点是恢复速度快而快照的频率不好把握,如果频率过低,数据丢失的量就比较多,如果频率高就会影响性能

所以退出了混合持久化集成两者优点,在AOF重写日志时,fork出来的子进程会把当前主线程共享的内存数据以RDB方式写入到AOF文件,然后主线程处理的命令被记录到重写缓冲区中,重写缓冲区中的命令会以追加AOF的形式存在AOF日志中

225c19b532ba4bf886564bfdd8e05a24.png

混合持久化的优缺点

优点

集成了AOF与RDB的优点

缺点

文件可读性变差

相关文章
|
3月前
|
NoSQL 安全 关系型数据库
Redis:持久化的两种方式
Redis持久化机制主要包括RDB和AOF两种方式。RDB通过生成数据快照进行持久化,支持手动或自动触发,具有加载速度快、文件紧凑等特点,但无法实时保存数据。AOF则记录每个操作命令,保障数据更安全,支持多种写入策略,并可通过重写机制优化文件大小。两者各有优劣,常结合使用以兼顾性能与数据安全。
|
3月前
|
存储 缓存 NoSQL
Redis持久化深度解析:数据安全与性能的平衡艺术
Redis持久化解决内存数据易失问题,提供RDB快照与AOF日志两种机制。RDB恢复快、性能高,但可能丢数据;AOF安全性高,最多丢1秒数据,支持多种写回策略,适合不同场景。Redis 4.0+支持混合持久化,兼顾速度与安全。根据业务需求选择合适方案,实现数据可靠与性能平衡。(238字)
|
8月前
|
存储 NoSQL 数据库
Redis 逻辑数据库与集群模式详解
Redis 是高性能内存键值数据库,广泛用于缓存与实时数据处理。本文深入解析 Redis 逻辑数据库与集群模式:逻辑数据库提供16个独立存储空间,适合小规模隔离;集群模式通过分布式架构支持高并发和大数据量,但仅支持 database 0。文章对比两者特性,讲解配置与实践注意事项,并探讨持久化及性能优化策略,助你根据需求选择最佳方案。
291 5
|
3月前
|
存储 运维 NoSQL
Redis集群模式
Redis集群是一种分布式存储方案,旨在解决数据存储容量不足的问题。它通过将数据分片存储在多个节点上,实现数据的横向扩展。常见的分片算法包括哈希求余、一致性哈希和哈希槽分区。其中,Redis采用哈希槽分区算法,将数据均匀分配到16384个槽位中,每个分片负责一部分槽位。当节点故障时,集群通过故障检测和主从切换机制,确保服务的高可用性。集群还支持自动的数据迁移和负载均衡,保障系统稳定运行。
|
6月前
|
存储 监控 NoSQL
流量洪峰应对术:Redis持久化策略与内存压测避坑指南
本文深入解析Redis持久化策略与内存优化技巧,涵盖RDB快照机制、AOF重写原理及混合持久化实践。通过实测数据揭示bgsave内存翻倍风险、Hash结构内存节省方案,并提供高并发场景下的主从复制冲突解决策略。结合压测工具链构建与故障恢复演练,总结出生产环境最佳实践清单。
186 9
|
10月前
|
存储 NoSQL 安全
Redis的两种持久化方式---RDB、AOF
通过本文的介绍,我们详细讲解了Redis的两种主要持久化方式:RDB和AOF。每种方式都有其独特的优缺点和适用场景。在实际应用中,可以根据具体需求选择合适的持久化方式,或者同时启用RDB和AOF,以达到最佳效果。希望本文能帮助您更好地理解和应用Redis的持久化机制,构建高效、可靠的数据存储解决方案。
933 79
|
9月前
|
NoSQL Redis
Redis的数据持久化策略有哪些 ?
Redis 提供了两种方式,实现数据的持久化到硬盘。 1. RDB 持久化(全量),是指在指定的时间间隔内将内存中的数据集快照写入磁盘。 2. AOF持久化(增量),以日志的形式记录服务器所处理的每一个写、删除操作 RDB和AOF一起使用, 在Redis4.0版本支持混合持久化方式 ( 设置 aof-use-rdb-preamble yes )
|
NoSQL Redis
03- Redis的数据持久化策略有哪些 ?
Redis的数据持久化包括两种策略:RDB(全量快照)和AOF(增量日志)。RDB在指定时间间隔将内存数据集保存到磁盘,而AOF记录所有写操作形成日志。从Redis 4.0开始,支持RDB和AOF的混合持久化,通过设置`aof-use-rdb-preamble yes`。
167 1
|
12月前
|
NoSQL 安全 Redis
redis持久化策略
Redis 提供了两种主要的持久化策略:RDB(Redis DataBase)和AOF(Append Only File)。RDB通过定期快照将内存数据保存为二进制文件,适用于快速备份与恢复,但可能因定期保存导致数据丢失。AOF则通过记录所有写操作来确保数据安全性,适合频繁写入场景,但文件较大且恢复速度较慢。两者结合使用可增强数据持久性和恢复能力,同时Redis还支持复制功能提升数据可用性和容错性。
221 5
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略