Redis 源码简洁剖析 14 - Redis 持久化
Redis 持久化方式
主要参考 Redis 官方文档:Redis Persistence。共有 4 种持久化方式:
- RDB (Redis Database):以指定的时间间隔执行数据在某个时间点的快照。
 - AOF (Append Only File):AOF 持久化记录服务器接收到的每个写操作。Redis server 在启动时会重放这些操作,进而重建数据。记录的命令与 Redis 协议的格式相同,并且是以追加的方式记录。当日志变得太大时,Redis 能够在后台 重写 日志。
 - No persistence:用户也可以完全禁用持久性,数据只在内存中使用。
 - RDB + AOF:可以在同一个实例中结合 AOF 和 RDB。在这种情况下,Redis 重启时会使用 AOF 文件重建原始数据,因为它是最完整的。
 
RDB
优势
- RDB 是 Redis 数据在某个时间点的文件,格式非常紧凑,非常适合作为备份。比如我们可以在最近的 24 小时内,每小时归档一个 RDB 文件,并在 30 天内每天保存一次 RDB 快照。这样我们可以轻松恢复不同版本的数据。
 - RDB 非常适合灾难恢复,RDB 文件是可以传输的单个紧凑文件。
 - RDB 提升 Redis 的性能,因为 Redis 父进程为了持久化而做的唯一操作,就是派生一个将完成其余所有操作的子进程。
 - 与 AOF 相比,RDB 在大数据集恢复时更迅速。
 
劣势
- RDB 在 Redis 宕机的情况下,更容易丢失数据。如果我们每 5 分钟创建一次 RDB 快照,如果 Redis 没有正常关闭,那最新几分钟的数据就会丢失。
 - RDB 需要经常 fork() 出在磁盘上持久化的子进程。在数据很大、CPU 性能不好时,会导致 Redis 在几毫秒甚至一秒内不对外服务。
 
AOF
以独立日志的方式,记录每次写命令,重启时再重新执行 AOF 文件中的命令,进而回复数据。相对于 RDB 的记录数据,AOF 是记录数据产生的过程。
优势
- 服务宕机时丢失数据更少,比如仅丢失最后 1s 的数据。
 - AOF 日志只是附加日志,不会出现寻道问题,也不会在断电时出现损坏。
 - AOF 日志易于理解和解析,包含所有操作。
 
劣势
- AOF 文件比相同数据集的 RDB 文件大。
 - 取决于具体的 fsync 策略,AOF 可能比 RDB 慢。
 
Redis < 7.0
- 在重新期间对数据库的写入,AOF 可能占用大量内存(缓冲在内存中,并在最后写入新的 AOF)。
 - 重写期间,所有写入的命令都会写入磁盘两次。
 
在 redis.conf 中,可以看到 appendfsync 有 3 个值:
no: don't fsync, just let the OS flush the data when it wants. Faster.always: fsync after every write to the append only log. Slow, Safest.everysec: fsync only one time every second. Compromise.
# The fsync() call tells the Operating System to actually write data on disk
# instead of waiting for more data in the output buffer. Some OS will really flush
# data on disk, some other OS will just try to do it ASAP.
#
# Redis supports three different modes:
#
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.
#
# The default is "everysec", as that's usually the right compromise between
# speed and data safety. It's up to you to understand if you can relax this to
# "no" that will let the operating system flush the output buffer when
# it wants, for better performances (but if you can live with the idea of
# some data loss consider the default persistence mode that's snapshotting),
# or on the contrary, use "always" that's very slow but a bit safer than
# everysec.
#
# More details please check the following article:
# http://antirez.com/post/redis-persistence-demystified.html
#
# If unsure, use "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
参考链接
Redis 源码简洁剖析系列
Java 编程思想-最全思维导图-GitHub 下载链接,需要的小伙伴可以自取~
原创不易,希望大家转载时请先联系我,并标注原文链接。
Redis 源码简洁剖析 14 - Redis 持久化的更多相关文章
- Redis 源码简洁剖析 03 - Dict Hash 基础
		
Redis Hash 源码 Redis Hash 数据结构 Redis rehash 原理 为什么要 rehash? Redis dict 数据结构 Redis rehash 过程 什么时候触发 re ...
 - Redis 源码简洁剖析 11 - 主 IO 线程及 Redis 6.0 多 IO 线程
		
Redis 到底是不是单线程的程序? 多 IO 线程的初始化 IO 线程运行函数 IOThreadMain 如何推迟客户端「读」操作? 如何推迟客户端「写」操作? 如何把待「读」客户端分配给 IO 线 ...
 - Redis 源码简洁剖析 12 - 一条命令的处理过程
		
命令的处理过程 Redis server 和一个客户端建立连接后,会在事件驱动框架中注册可读事件--客户端的命令请求.命令处理对应 4 个阶段: 命令读取:对应 readQueryFromClient ...
 - Redis 源码简洁剖析 13 - RDB 文件
		
RDB 是什么 RDB 文件格式 Header Body DB Selector AUX Fields Key-Value Footer 编码算法说明 Length 编码 String 编码 Scor ...
 - Redis 源码简洁剖析 15 - AOF
		
AOF 是什么 AOF 持久化的实现 命令追加 AOF 文件的写入和同步 AOF 文件的载入和数据还原 AOF 重写 为什么需要重写 什么是重写 如何重写 AOF 后台重写 为什么需要后台重写 带来的 ...
 - Redis 源码简洁剖析 02 - SDS 字符串
		
C 语言的字符串函数 C 语言 string 函数,在 C 语言中可以使用 char* 字符数组实现字符串,C 语言标准库 string.h 中也定义了多种字符串操作函数. 字符串使用广泛,需要满足: ...
 - Redis 源码简洁剖析 04 - Sorted Set 有序集合
		
Sorted Set 是什么 Sorted Set 命令及实现方法 Sorted Set 数据结构 跳表(skiplist) 跳表节点的结构定义 跳表的定义 跳表节点查询 层数设置 跳表插入节点 zs ...
 - Redis 源码简洁剖析 05 - ziplist 压缩列表
		
ziplist 是什么 Redis 哪些数据结构使用了 ziplist? ziplist 特点 优点 缺点 ziplist 数据结构 ziplist 节点 pre_entry_length encod ...
 - Redis 源码简洁剖析 06 - quicklist 和 listpack
		
quicklist 为什么要设计 quicklist 特点 数据结构 quicklistCreate quicklistDelIndex quicklistDelEntry quicklistInse ...
 - Redis 源码简洁剖析 07 - main 函数启动
		
前言 问题 阶段 1:基本初始化 阶段 2:检查哨兵模式,执行 RDB 或 AOF 检测 阶段 3:运行参数解析 阶段 4:初始化 server 资源管理 初始化数据库 创建事件驱动框架 阶段 5:执 ...
 
随机推荐
- python-requests模拟上传文件-带参数
			
方法1: 1.安装requests_toolbelt依赖库 #代码实现def upload(self): login_token = self.token.loadTokenList() for to ...
 - kerberos系列之spark认证配置
			
大数据安全系列的其它文章 https://www.cnblogs.com/bainianminguo/p/12548076.html-----------安装kerberos https://www. ...
 - C#使用Socket实现分布式事件总线,不依赖第三方MQ
			
使用 Socket 实现的分布式事件总线,支持 CQRS,不依赖第三方 MQ. CodeWF.EventBus.Socket 是一个轻量级的.基于 Socket 的分布式事件总线系统,旨在简化分布式架 ...
 - Data-Free,多目标域适应合并方案,简单又有效 | ECCV'24
			
来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: Training-Free Model Merging for Multi-target Domain Adaptation 论文地址:htt ...
 - 推荐一个Star超过2K的.Net轻量级的CMS开源项目
			
推荐一个具有模块化和可扩展的架构的CMS开源项目. 01 项目简介 Piranha CMS是一个轻量级且跨平台的CMS库,专为.NET 8设计. 该项目提供多种模板,具备CMS基本功能,也有空模板方便 ...
 - RL 基础 | 如何使用 OpenAI Gym 接口,搭建自定义 RL 环境(详细版)
			
参考: 官方链接:Gym documentation | Make your own custom environment 腾讯云 | OpenAI Gym 中级教程--环境定制与创建 知乎 | 如何 ...
 - 深度解析:Air780E模组之SIM卡接口电路的设计原理
			
 SIM卡接口用于连接SIM卡并读取SIM卡信息,以便在注册4G网络时进行鉴权身份验证,是4G通信系统的必要功能. 合宙低功耗4G模组经典型号Air780E支持两路SIM卡,支持双卡切换,便于设备灵 ...
 - 剖析Air724UG的硬件设计,有大发现?02篇
			
 3.8 I2C 管脚名 类型 序号 电压域 描述 I2C2_SCL IO 32 V_GLOBAL_1V8 I2C2 时钟信号,用作 I2C 时需外加 1.8V 上拉 I2C2_SDA IO 31 ...
 - Docker配置Trojan代理
			
1.遇到的问题 在做云计算作业,使用阿里云的ECS服务器尝试使用docker拉取镜像的时候,发现一直无法从仓库拉取,更换了多个镜像源也没有解决问题,于是决定学会去配置linux的代理,记录过程. 2. ...
 - typescript 安装调试(二)
			
一.安装ts-node 今天介绍另外一种更加方便的ts调试方式,需要安装以下几个库 第一个库是ts-node,这个库可以直接运行ts文件无需实时编译成js文件后再运行 安装命令 npm i ts-n ...