【Redis学习1】Redis持久化机制详解

Redis持久化机制详解

一、Redis为什么需要持久化机制

Redis一般用作缓存,其数据存储在内存中,当Redis宕机后,内存中的数据将会丢失。因此使用缓存的时候,我们经常需要对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中

Redis 不同于 Memcached 的很重要一点就是,Redis 支持持久化,而且支持 3 种持久化方式::

  • 快照(RDB)
  • 只追加文件(AOF)
  • RDB 和 AOF的混合持久化(Redis4.0新增)

二、RDB持久化

(一)什么是RDB持久化

1、快照持久化:在指定的时间间隔内将内存中的数据以快照的形式写入磁盘(内存中的数据以二进制序列化的形式写入磁盘)

2、在满足默认配置的RDB生成时,Redis会fork出子进程来进行持久化,不阻塞主进程的执行。子进程将数据写入临时文件,然后替换旧的RDB文件进而完成磁盘的写入,主进程可以处理读写请求。

RDB快照持久化是Redis默认采用的持久化方式,RDB默认配置的生成策略如下:

save 900 1           #在900(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发bgsave命令创建快照。save 300 10          #在300(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发bgsave命令创建快照。save 60 10000        #在60(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发bgsave命令创建快照。

(二)RDB持久化的优、缺点

优点:

  • 1、直接存储内存数据的二进制序列化形式,占用磁盘更小
  • 2、宕机后重启恢复的速度比AOF快

缺点:

  • RDB持久化是需要Redis fork出子进程来执行持久化,频繁的执行成本较高

三、AOF持久化

(一)什么是AOF持久化

AOF(append only file)只追加文件:与快照持久化(RDB)相比,AOF持久化的实时性更好。AOF持久化默认是不开启的(Redis6.0 版本之后默认是开启的)

开启AOF持久化后每执行一条能改变Redis中数据的命令,1、Redis服务器就会将该指令追加到AOF缓冲区 2、然后调用write函数将数据将数据写到系统内核缓冲区(注意!!此时并没有同步到磁盘) 3、最后根据持久化方式(fsync策略)将缓存区的数据同步到磁盘中。

在这里插入图片描述
根据如上所述我们可以概述出,AOF工作基本流程。

(二)AOF持久化的基本流程

AOF持久化功能的实现可以简单分为5步:

  • 1、命令追加(append):Redis所执行的所有的写命令会追加到AOF缓冲区。
  • 2、文件写入(write):这一步需要调用write函数(系统调用)将数据写入到系统缓冲区,注意!!! 此时并没有写到磁盘
  • 3、文件同步(fsync):根据对应的持久化方式(fsync策略),调用fsync函数,进行磁盘的同步操作
  • 4、文件重写(rewrite):随着AOF文件越来越大,需要定期进行AOF的重写,来达到压缩的目的(注意:AOF重写并非是对旧的AOF文件进行重写来达到压缩的目的,而是通过重新去获取最新执行的Redis指令并生成一个新的AOF文件进而替换旧的AOF文件来完成重写:fork + 双写)
  • 5、重启加载(load):当Redis重启时,可以加载AOF文件进行数据恢复

(三)AOF持久化的三种回写策略(fsync策略)

Redis提供了三种不同的AOF持久化方式(fsync回写策略),分别是:Always、Everysec、No三种回写策略。

  • 1、Always:主线程调用write将数据写入到系统缓冲区后,立即调用fsync函数将数据同步到AOF文件,完成后线程返回。这样严重降低Redis的性能(write + fsync)
  • 2、Everysec:主线程调用write将数据写入系统缓冲区后立即返回,由后台线程每隔1s调用fsync函数将数据同步到AOF文件(write + fsync ,fsync时间间隔为1s)
  • 3、No:主线程调用write将数据写入系统缓冲区后立即返回,由操作系统决定何时进行同步。Linux下一般为30S一次(write 但不fsync,fsync的时机由操作系统决定)

(四)AOF重写

随着AOF文件变得越来越大,系统的性能将会受到影响,所以我们需要进行AOF的重写来达到压缩的目的。

我们这里需要注意AOF重写并非是对旧的AOF文件进行重写,而是根据缓存中最新的Redis指令生成一个新的AOF文件进而替换旧的AOF文件来完成重写。重写期间Redis还会维护一个AOF重写缓冲区

AOF重写逻辑主要分为两步:fork + 双写

  • 1、主线程先fork出子进程,子进程复制父进程的虚拟页表(此处为什么不是直接拷贝数据而是复制虚拟机页表呢,是为了防止一次性拷贝大量数据导致主线程阻塞过长和内存浪费的问题)
  • 2、子进程读取内存中的数据并写到AOF重写缓冲区进而同步到新的AOF文件中
  • 3、重写期间,主进程还是会正常接收写命令,新的命令不仅会写入AOF旧的文件,还会写入AOF新的文件,保证重写的过程中发生宕机旧的AOF文件还是全的
  • 4、重写完成后将新的AOF文件替换旧的AOF文件。

三、混合持久化

(一)AOF持久化

优点:
AOF持久化实时性更强,数据安全性更高
缺点:
AOF文件需要定期进行瘦身,宕机后恢复速度相比与RDB持久化要慢

(二)RDB持久化

优点:
DRB持久化存储的是二进制序列化的数据,宕机后恢复速度要比AOF持久化要快
缺点:
数据的实时性及安全性要差一些。

Redis4.0 提出了混合使用AOF和RDB的方式。
RDB快照按照一定的频率生成,两次快照间增量命令记录到AOF文件中。这种混合持久化即具备RDB的快速恢复能力,同时也具备跟高的数据安全性。

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

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

相关文章

Jetpack:004-如何使用文本组件

文章目录 1. 概念介绍2. 使用方法2.1 通用参数2.2 专用参数 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack组件在布局中的对齐方式,本章回中主要介绍文 本组件的使用方法。闲话休提,让我们一起Talk Android Jetpack吧 1. 概念介绍 我们在本章…

YOLOv7改进:SPD-Conv,低分辨率图像和小物体涨点明显,涨点神器!!!

💡💡💡本文属于原创独家改进:SPD-Conv,优势:处理低分辨率图像和小物体等更困难的任务时性能更优 SPD-Conv | 亲测在多个数据集实现暴力涨点,尤其是小物体检测你值得拥有,强烈推荐,独家首发; 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨…

基于ffmpeg给视频添加时间字幕

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序,我们可以基于ffmpeg对视频进行各种操作。本文主要介绍基于ffmpeg给视频添加字幕,字幕的内容为视频所播放的时间(故需要安装ffmpeg,具…

Stream 流式编程创建及其常用操作方法

目录 Stream 对象如何创建 Stream 常用的操作方法 1.过滤(Filter) 2.映射(Map) 3.扁平映射(FlatMap) 4.截断(Limit) 5.跳过(Skip) 6.排序&#xff08…

ssti 前置学习

python venv环境 可以把它想象成一个容器,该容器供你用来存放你的Python脚本以及安装各种Python第三方模块,容器里的环境和本机是完全分开的 创建venv环境安装flask #apt install python3.10-venv #cd /opt #python3 -m venv flask1 #cd /opt 选…

吃透底层:从路由到前缀树

前言 今天学到关于路由相关文章,发现动态路由中有一个很常见的实现方式是前缀树,很感兴趣这个算法,故进行记录。 前缀树 Trie(又被叫做字典树)可以看作是一个确定有限状态自动机,尽管边上的符号一般是隐含…

Netty通信在中间件组件中的广泛使用-Dubbo3举例

Netty是一个高性能异步IO通信框架,封装了NIO,对各种bug做了很好的优化解决。所以很多中间件底层的通信都会使用Netty,比如说:Dubbo3,rocketmq,ElasticSearch等。 比方说,我们使用dubbo作为rpc跨…

基于SSM线上课程管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

C++构造函数

在本文中,您将学习C 中的构造函数。您将学习什么是构造函数,如何创建它以及C 中的构造函数类型。 构造函数是成员函数的一种特殊类型,它在创建对象时会自动对其进行初始化。编译器通过其名称和返回类型将给定的成员函数标识为构造函数。构造函…

网络编程中套接字(socket)介绍(Python示例)

网络编程中套接字(socket)介绍(Python示例) 网络编程就是同一计算机的进程间或者不同的联网计算机之间的通信(交换数据)。 那么,这两台计算机之间用什么传输数据呢?首先你肯定先需要…

各报文段格式集合

数据链路层-- MAC帧 前导码8B:数据链路层将封装好的MAC帧交付给物理层进行发送,物理层在发送MAC帧前,还要在前面添加8字节的前导码(分为7字节的前同步码1字节的帧开始定界符)MAC地址长度6B数据长度46~1500B…

scala 连接 MySQL 数据库案例

1 依赖准备 mysql 8添加&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency> mysql 5 添加&#xff1a; <dependency><grou…

爬取微博热榜并将其存储为csv文件

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言1.…

防止SQL注入攻击的综合解决方案

文章目录 摘要背景和危害性防御措施示例代码&#xff08;Java&#xff09;示例代码&#xff08;PHP&#xff09;示例MySQL命令示例代码&#xff08;Python&#xff09;示例代码&#xff08;C#&#xff0c;使用Entity Framework&#xff09; 进一步防御SQL注入攻击的措施使用ORM…

【Linux】Git使用

一、Git简介 Git 是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理很小或非常大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同&#xff0c;它采用了分布…

Kafka 简介之(学习之路)

正文 一、简介 1.1 概述 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、分区的、多副本的、多订阅者&#xff0c;基于zookeeper协调的分布式日志系统&#xff08;也可以当做MQ系统&#xff09;&#xff0c;常见可以用于web/nginx日志、访问日志&#xff0c;消息服务…

原生JS-鼠标拖动

原生JS-鼠标拖动 通过鼠标的点击事件通过h5的属性 通过鼠标的点击事件 步骤&#xff1a; 1. 鼠标按下div。 2. 鼠标移动&#xff0c;div跟着移动 原生js&#xff0c;实现拖拽效果。1. 给被拖拽的div加上 onmousedown 鼠标【按下事件】。鼠标按下的时候&#xff0c;开始监听鼠标…

【Spring框架学习3】Spring Bean的作用域 及 生命周期

一、Spring Bean的作用域有哪些&#xff1f; Spring框架支持以下五种Bean的作用域&#xff1a; Singleton&#xff1a;这是默认的作用域&#xff0c;在每个Spring IoC容器中只有一个Bean的实例(IoC初始化后)。Spring 中的 bean 默认都是单例的&#xff0c;是对单例设计模式的…

JackJson和FastJson

前言&#xff1a; fastjson是一款强大的json格式转换工具&#xff0c;我个人在开发中就非常喜欢用fastjson&#xff1b;但是由于某些原因&#xff0c;导致fastjson会有一些漏洞&#xff0c;因此在漏洞扫描后需要修复都是要求我们升级版本&#xff0c;或者替换为jackjson&#…

使用uwsgi部署Flask

安装 这里直接使用包管理器提供的版本&#xff0c;不过建议大家使用pip来安装&#xff0c;会少一些坑&#xff1a; (Debian/Ubuntu) apt-get install uwsgi uwsgi-plugin-python3 或使用pip安装&#xff1a; pip3 install uwsgi 试试看 [demo.py] from flask import Flas…