Redis持久化详解

 【关闭文件、AOF 刷盘、释放内存这三个任务都有各自的任务队列】所以不是单线程

Redis有两种持久化方案:

  • RDB持久化

  • AOF持久化

  • 基于Redis集群解决单机Redis存在的问题

【Redis是单进程的】

【也有人做分布式section】

【主从集群中多个从就是做负载均衡的】

单机的Redis存在四大问题:

RDB持久化

【执行 bgsave 过程中,Redis 依然可以继续处理操作命令的,也就是数据是能被修改的,关键的技术就在于写时复制技术(Copy-On-Write, COW)。

RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。【全量拷贝】

1.执行时机

RDB持久化在四种情况下会执行:

  • 执行save命令

  • 执行bgsave命令

  • Redis停机时

  • 触发RDB条件时

1)save命令

执行下面的命令,可以立即执行一次RDB:

redis-cli中执行save

save命令会导致主进程执行RDB,这个过程中其它所有命令都会被阻塞。只有在数据迁移时可能用到。

2)bgsave命令

下面的命令可以异步执行RDB:

bgsave

这个命令执行后会开启独立进程完成RDB,主进程可以持续处理用户请求,不受影响。

3)停机时

Redis停机时会执行一次save命令,实现RDB持久化。

4)触发RDB条件

Redis内部有触发RDB的机制,可以在redis.conf文件中找到,格式如下:

 # 900秒内,如果至少有1个key被修改,则执行bgsave , 如果是save "" 则表示禁用RDBsave 900 1  save 300 10  save 60 10000 

RDB的其它配置也可以在redis.conf文件中设置:

 # 是否压缩 ,建议不开启,压缩也会消耗cpu,磁盘的话不值钱rdbcompression yes​# RDB文件名称dbfilename dump.rdb  ​# 文件保存的路径目录dir ./ 

2.RDB原理

bgsave开始时会fork主进程得到子进程【此时主进程是阻塞的,所以要加快fork的速度】,子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。

fork采用的是copy-on-write(写时复制技术):内存大时还是很耗时,还需要大量磁盘IO,对性能影响大。

  • 当主进程执行读操作时,访问共享内存;

  • 当主进程执行写操作时,则会拷贝一份数据(数据副本),执行写操作。fork会把共享内存标记为read-only,以后主进程读操作时也往副本,页表变了。

【所有进程都没法操作物理内存,所以由操作系统给每个进程分配一个虚拟内存,操作系统还会维护虚拟内存和物理内存之间的映射关系表(页表),从而实现读写。fork的过程就是对页表做拷贝】

【redis一般预留空间,防止被副本翻倍消耗完】

3.小结

RDB方式bgsave的基本流程?

  • fork主进程得到一个子进程,共享内存空间

  • 子进程读取内存数据并写入新的RDB文件

  • 用新RDB文件替换旧的RDB文件

RDB会在什么时候执行?save 60 1000代表什么含义?

  • 默认是服务停止时

  • 代表60秒内至少执行1000次修改则触发RDB

  • 宕机数据会丢失

RDB的缺点?

  • RDB执行间隔时间长,两次RDB之间写入数据有丢失的风险

  • fork子进程、压缩、写出RDB文件都比较耗时

AOF持久化

【大大提高数据的安全性,弥补RDB】

1.AOF原理

AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。【不像RDB每次都从头开始写文件,累加】

【先写到Redis,再把命令写到AOF文件,将来恢复只需要重新执行命令】

2.AOF配置

AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:

 # 是否开启AOF功能,默认是noappendonly yes# AOF文件的名称appendfilename "appendonly.aof"

AOF的命令记录的频率也可以通过redis.conf文件来配:

 # 表示每执行一次写命令,立即记录到AOF文件,先操作内存再写到磁盘(性能最差)appendfsync always # 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案appendfsync everysec # 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘appendfsync no

三种刷盘策略对比:

3.AOF文件重写

【AOF执行rewrite的缓冲区。无法设置容量上限】

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令(后台子进程 bgrewriteaof来完成),可以让AOF文件执行重写功能,用最少的命令达到相同效果。

【子进程带有主进程的数据副本,这里使用子进程而不是线程,防止共享数据更改(只读)(主进程修改了会发生「写时复制」,所以用副本保证数据安全)时使用锁降低性能】

【aof文件压缩后看不懂,此时再加命令会接着写,不过不会反压缩回来】

set num 123 和 set num 666都是对num的操作,第二次会覆盖第一次的值,因此第一个命令记录下来没有意义。【读取当前数据库中的所有键值对,然后将每一个键值对用一条命令记录到「新的 AOF 文件」】

所以重写命令后,AOF文件内容就是:mset name jack num 666

Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:

 # AOF文件比上次文件 增长超过多少百分比则触发重写auto-aof-rewrite-percentage 100# AOF文件体积最小多大以上才触发重写 auto-aof-rewrite-min-size 64mb 

RDB与AOF对比

RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

【一般两者一起用】

【RDB相当于备份,异地容灾,机房毁了,aof也废了】

【aof写磁盘多,好在是异步的】

混合

前部分是rdb,当同步过程新来的就会进行aof降低数据丢失率。

  • 兼容性差,如果开启混合持久化,那么此混合持久化 AOF 文件,就不能用在 Redis 4.0 之前版本了。

混合持久化是在AOF持久化的基础上,定期进行RDB持久化。具体实现方式是在AOF重写时,将RDB文件以二进制压缩格式写入到AOF文件的开头,之后的数据再以AOF格式追加到文件的末尾。这样,在Redis重启时,可以优先加载RDB部分的数据,快速恢复大部分数据,然后再通过AOF部分的命令来更新内存中的数据,以保证数据的完整性。

总结

Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:

  • 用来做缓存的Redis实例尽量不要开启持久化功能【提高查询效率的不需要持久化,查询时再写一遍就好。对于安全性要求高的,比如分布式锁、库存、验订单的流水需要持久化(可以专门放在一个redis实例)】

  • 建议关闭RDB持久化功能,使用AOF持久化【可以混合。rdb会丢失数据】

  • 利用脚本定期在slave节点做RDB,实现数据备份

  • 设置合理的rewrite阈值,避免频繁的bgrewrite

  • 配置no-appendfsync-on-rewrite = yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞【主从同步时还是要fork(大量磁盘IO),rewrite也有磁盘IO且时间长,aof刷盘也需要读写磁盘。rewrite占用磁盘高会影响aof刷盘】fsync刷盘

  • 部署有关建议:

    • Redis实例的物理机要预留足够内存,应对fork和rewrite【fork可能翻倍,写时复制】

    • 单个Redis实例内存上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力

    • 不要与CPU密集型应用部署在一起【fork等CPU要求高。es也高】

    • 不要与高硬盘负载应用一起部署。例如:数据库、消息队列


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/367870.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈如何在linux上部署java环境

文章目录 一、部署环境1.1、JDK1.2、Tomcat1.3、MySQL 二、将自己写的的程序部署到云服务器上 一、部署环境 为了在linux上部署 Java web 程序,需要安装一下环境。 1.1、JDK 直接使用 yum 命令安装 openjdk。我们 windows系统上 下载的是 oracle 官方的 jdk。而 …

uniapp uniCloud云开发

uniCloud概述 uniCloud 是 DCloud 联合阿里云、腾讯云、支付宝云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 uniCloud 的 web控制台地址:https://unicloud.dcloud.net.cn 文档:https://doc.dcloud.net.cn/uniCloud/ un…

python 第6册 辅助excel 002 批量创建非空白的 Excel 文件

---用教授的方式学习 此案例主要通过使用 while 循环以及 openpyxl. load_workbook()方法和 Workbook 的 save()方法,从而实现在当前目录中根据已经存在的Excel 文件批量创建多个非空白的Excel 文件。当运行此案例的Python 代码(A002.py 文件&#xff0…

AnyView 对 SwiftUI 性能的影响

文章目录 前言测试设置动画卡顿浏览数据没有 AnyView 有 AnyView在浏览数据时修改没有 AnyView 有 AnyView分析结果总结 前言 AnyView 是一种类型擦除的视图,对于 SwiftUI 容器中包含的异构视图非常方便。在这些情况下,你不需要指定视图层次结构中所有视…

Java环境变量的设置

JAVA环境变量的设置 1.设置环境变量的作用2.如何设置环境变量2.1 找到系统的环境变量2.2 设置环境变量 1.设置环境变量的作用 说明:在Java中设置环境变量主要是为了能够让Java运行时能够找到Java开发工具包(JDK)的安装位置以及相关的库文件。…

【强化学习】第01期:绪论

笔者近期上了国科大周晓飞老师《强化学习及其应用》课程,计划整理一个强化学习系列笔记。笔记中所引用的内容部分出自周老师的课程PPT。笔记中如有不到之处,敬请批评指正。 文章目录 1.1 概述1.2 Markov决策过程1.2.1 Markov Process (MP) 马尔科夫过程1…

大模型对汽车行业意味着什么?_汽车企业大模型

引 言 大模型是一种利用海量数据进行训练的深度神经网络模型,其特点是拥有庞大的参数规模和复杂的计算结构。通过在大规模数据集上进行训练,大模型能够学习到丰富的模式和特征,从而具备强大的泛化能力,可以对未知数据做出准确的预…

Qt实战项目——贪吃蛇

一、项目介绍 本项目是一个使用Qt框架开发的经典贪吃蛇游戏,旨在通过简单易懂的游戏机制和精美的用户界面,为玩家提供娱乐和编程学习的机会。 游戏展示 二、主要功能 2.1 游戏界面 游戏主要是由三个界面构成,分别是游戏大厅、难度选择和游戏…

【LeetCode刷题】3099.哈沙德数

题目链接 3099. 哈沙德数 - 力扣(LeetCode) 实现代码 int sumOfTheDigitsOfHarshadNumber(int x) {int sum 0;for(int temp x; temp; temp / 10)sum temp % 10;return x%sum ? -1 : sum; }

【C语言】指针经典例题

题1&#xff1a; #include <stdio.h>int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));return 0; } //程序的结果是什么&#xff1f; 解答如下&#xff1a; 题2&#xff1a; #include <std…

NSSCTF-Web题目18(反序列化)

目录 [NISACTF 2022]babyserialize 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]ez_ez_unserialize 4、题目 5、知识点 6、思路 [NISACTF 2022]babyserialize 1、题目 2、知识点 反序列化、绕过过滤、命令执行 3、思路 <?php include "waf.php";…

【ES】--Elasticsearch的翻页详解

目录 一、前言二、from+size浅分页1、from+size导致深度分页问题三、scroll深分页1、scroll原理2、scroll可以返回总计数量四、search_after深分页1、search_after避免深度分页问题一、前言 ES的分页常见的主要有三种方式:from+size浅分页、scroll深分页、search_after分页。…

《昇思25天学习打卡营第7天|函数式自动微分》

文章目录 今日所学&#xff1a;一、函数与计算图二、微分函数与梯度计算三、Stop Gradient四、Auxiliary data五、神经网络梯度计算总结 今日所学&#xff1a; 今天我学习了神经网络训练的核心原理&#xff0c;主要是反向传播算法。这个过程包括将模型预测值&#xff08;logit…

【设计模式】行为型-状态模式

在变幻的时光中&#xff0c;状态如诗篇般细腻流转。 文章目录 一、可调节的灯光二、状态模式三、状态模式的核心组件四、运用状态模式五、状态模式的应用场景六、小结推荐阅读 一、可调节的灯光 场景假设&#xff1a;我们有一个电灯&#xff0c;它可以被打开和关闭。用户可以…

大模型与机器人精彩碰撞-7月5日晚上八点不见不散!

在瞬息万变的科技时代&#xff0c;新兴人工智能和机器人技术的结合正在引领新一轮的创新浪潮。你是否想成为未来科技的领航者&#xff1f;你是否想了解最前沿的AI与机器人技术&#xff1f;行麦科技重磅推出的“AIGC时代的生存法则”AI系列课&#xff0c;将为你揭开大模型与机器…

redis学习(001 介绍)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第1p-第p4的内容 文章目录 介绍差异对比事务区别 认识redis 介绍 两种键值对方式对比 差异对比 事务区别 认识redis

Paimon 在汽车之家的业务实践

汽车之家基于Paimon的实践 摘要&#xff1a;本文分享自汽车之家的王刚、范文、李乾⽼师。介绍了汽车之家基于 Paimon 的一些实践&#xff0c;和一些背景。内容主要为以下四部分&#xff1a; 一、背景 二、业务实践 三、paimon 优化实践 四、未来规划 一、背景 在使用Paimon之前…

Java---Mybatis详解二

雄鹰展翅凌空飞&#xff0c; 大江奔流不回头。 壮志未酬心未老&#xff0c; 豪情万丈任遨游。 巍巍高山攀顶峰&#xff0c; 滔滔黄河入海流。 风云变幻凭君舞&#xff0c; 踏遍天涯尽逍遥。 目录 一&#xff0c;环境准备 二&#xff0c;删除 三&#xff0c;删除(预编译SQL) 为什…

无法定位程序输入点Z9 qt assertPKcS0i于动态链接库F:\code\projects\06_algorithm\main.exe

解决方法&#xff1a; 这个报错&#xff0c;是因为程序在运行时没要找到所需的dll库&#xff0c;如果把这个程序方法中对应库的目录下执行&#xff0c;则可正常执行。即使将图中mingw_64\bin 环境变量上移到msvc2022_64\bin 之前也不可以。 最终的解决方法是在makefile中设置环…

RealMAN:大规模真实录制且经过注释的麦克风阵列数据集

在深度学习驱动的多通道语音增强和声源定位系统的开发中&#xff0c;由于缺乏大规模的真实录制数据集&#xff0c;这些系统的训练在很大程度上依赖于房间脉冲响应&#xff08;RIR&#xff09;和多通道扩散噪声的模拟。然而&#xff0c;模拟数据和真实世界数据之间存在的声学失配…