IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis之持久化 -> 正文阅读

[大数据]Redis之持久化

Redis在运行中,数据是存储在内存中的,因为存在各种问题导致服务器宕机或者进程死掉,那么重新启动Redis之后数据就没有了,所以我们需要一种持久化机制,将内存中的数据持久化到磁盘,下一次重启就可以从持久化文件恢复数据。Redis提供了2种持久化机制:RDB和AOF

一 RDB

RDB持久化就是Redis 把当前进程的数据生成快照存储到磁盘的过程,持久化的触发过程中分为:自动触发和手动触发。

1.1 自动触发

save m n

自动触发可以通过配置设置多少秒内存在多少次修改的时候,自动触发。比如配置文件中设置 save 900 10,表示900秒内存在10次修改就开始自动触发持久化。

1.2 手动触发

手动触发,顾名思义就是通过人为手段使用命令进行持久化。手动触发可以使用save和bgsave。

1.2.1 save

阻塞当前Redis服务器,直到RDB持久化完成,这个肯定在线上是不能用的

1.2.2 bgsave

Redis进程fork一个子进程,然后子进程负责持久化? ,这里也有可能有阻塞,就是创建子进程的时候,但是这个代价比save要小很多。

1.3 RDB文件处理

RDB文件保存在dir目录下,文件名字可以通过dbfilename指定。Redis默认会对rdb文件进行压缩处理,压缩后的文件远远小于内存大小默认开启压缩,即rdbcompression yes,若果不开启就配置off

这个参数虽然开启会消耗CPU,但是会大幅度降低rdb文件体积,方便保存和发送到其他网络。

如果Redis加载损坏的RDB文件的时候拒绝启动,可以使用Redis提供的redis-check-dump工具检测RDB文件并获取对应的错误报告

二 AOF

AOF 默认是不开启的,需需要在在配置文件配置appendonly yes。 Aof文件名字是appendonly.aof,保存路径也在dir指定的目录之下。

2.1 AOF 工作流程

第一:所有写入的命令会追加到缓冲区(aof_buf)

第二: AOF缓冲区根据对应的策略向硬盘做同步操作,将命令以文本格式写入。

第三: 随着AOF文件越拉越大,需要定期对AOF文件进行重写,达到压缩目的

第四:当Redis实例重启的时候,加载AOF文件进行数据恢复

2.2 AOF 重写工作流程

#1 Redis执行AOF重写请求

#2 Redis进程阻塞,fork一个子进程

#3 Redis创建完毕子进程继续处理命令,写入AOF缓存

#4 Redis并且同时将处理的命令写入AOF重写缓存

#5 Redis子进程创建新的AOF文件,并且根据fork之后的数据副本进行AOF重写

#6 Redis子进程将AOF文件重写完成之后,通知父进程

#7 Redis父进程把AOF重写缓冲区数据写入新AOF文件

#8 Redis父进程使用新的AOF文件替换旧的

2.3 文件同步策略

always: 每一次写入都要同步文件,在SATA硬盘上,Redis支持大于几百TPS写入

no: 不做同步

everysec: 建议的同步策略,每一秒同步一次

2.4 重写机制

随着命令不断写入,文件越拉越大,引入重写机制解决这个问题,压缩文件体积。这时候会把文件内的数据写的命令同步到新AOF:

#1 超时的数据不再写入

#2 旧文件无效的命令,比如del hdel srem set a 1 set a 2等

#3 多条命令合并为一个

2.4.1 自动触发

auto-aof-rewrite-min-size和auto-aof-rewrite-percentage参数确定自动触发时间。

auto-aof-rewrite-min-size:默认64M,即要自动触发AOF文件必须当前文件要大于64M

aof_rewrite_base_size:最近一次重写的大小

auto-aof-rewrite-percentage: AOF日志超过基准大小(aof_rewrite_base_size)的特定百分比时

2.4.2 手动触发

直接调用bgrewriteof命令就可以触发

三 Redis重启加载文件流程

#1 如果开启AOF,则判断是否有AOF文件

#2 如果AOF文件存在,则加载AOF文件

#3 如果AOF没有可以活着开启了但是没有AOF文件,检查是否有RDB文件

#4 如果RDB文件不存在则启动成功,不需要加载任何文件

#5 如果RDB文件存在则加载RDB文件

四 RDB和AOF比较

4.1 相同点

#1 都是为了持久化redis进程中的数据,下一次重启的时候可以加载持久化文件进行读取

#2 都会fork一个子进程来处理

4.2 不同点

#1 备份方式不同:RDB是全量备份,每一次备份都代表某一个时间点的数据快照;AOF是增量备份,可能是修改一次数据库或者每一秒就备份一次

#2 文件格式不一样:RDB是压缩的二进制格式,体积较小;AOF是文本格式,体积相对较大

#3 数据恢复速度不同:RDB因为是压缩的二进制格式,所以恢复速度比较快;AOF是文本格式,所以恢复速度慢

#4 备份精度不一样: RDB无法做到实时持久化或者按秒持久化,因为本身RDB就属于全量备份,不适合频繁执行;AOF可以做到实时持久化或者按秒持久化

五 怎么选择哪一种持久化方式

如果你可以忍受数分钟数据丢失,那就可以只使用rdb; 如果不允许的话推荐两种都使用,rdb用于容灾备份,便于传输,而且数据恢复速度快。其他情况就可以使用aof?恢复数据。所以不建议单独使用aof或者rdb。

重启 Redis 时,我们很少使用 rdb 来恢复内存状态,因为会丢失大量数据。我们通常使用?aof?日志重放,但是重放 aof?日志性能相对 rdb 来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。

Redis 4.X带来了一个新的方式——混合持久化。将 rdb 文件的内容和增量的 aof?日志文件存在一起。这里的 aof?日志不再是全量的日志,而是自持久化开始到持久化结束的这段时间发生的增量 aof?日志,通常这部分 aof?日志很小。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-27 14:09:28  更:2021-09-27 14:10:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:53:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码