【专栏】基础篇05| Redis 该怎么保证数据不丢失(下)

news2025/1/16 8:14:02

前言

    上一小节我们讲了AOF是什么以及它是如何保证Redis的Crash Safe的,这一节我们再来看一看Redis的RDB和AOF有何不同,两者是怎么样的关系

RDB的工作模式

    RDB全称Redis Database,我们也常叫做Redis的内存快,它与AOF最大的不同在于AOF记录的是Redis具体执行的命令,而RDB存储的是数据本身,这样在数据恢复时只需要将备份的rdb文件覆盖原文件就行了,避免了AOF重放命令的繁琐与开销。

    内存快照我们在Mysql中也有体现,Innodb为了保证事务实现了多版本并发控制,也就是MVCC,而事务的不同隔离级别影响着select可以“看到”的数据范围,因此undo log利用innodb中最新的事务id和最老的事务id形成了一个高低水位,组成一行数据的“快照”。但是innodb的快照只是服务与事务,因此不需要真正的把每一行数据本身放进快照中,但是RDB不一样,这是实打实的快照,从内存到磁盘文件的一个快照,因此我们首先想到的问题是会不会太重了?

    Redis进行RDB有两种方式:save和bgsave,save会在主进程中执行,而bgsave则会由主进程创建子进程进行快照。在前面AOF重写的时候我们说过,主进程fork会产生的额外的开销,其中就是页表所在的进程数据结构需要复制到子进程内存空间最为耗时,因此bgsave的好处在于不会在快照时阻塞主进程,但是fork时会额外开销;save则会全程影响主进程,因此bgsave是Redis的默认配置,它在Redis配置文件中如下:

在m时间内有n条数据改变了就进行快照,结合了时间与空间的一个配置。所以回过头来看,RDB确实是一个很重的操作,那么这个快照执行过程中的新数据怎么处理呢?

    和AOF重写一样,Linux下fork出子进程进行RDB也会有Copy On Write优化写入性能(参考:【专栏】基础篇04| Redis 该怎么保证数据不丢失(上)),RDB快照时也会有AOF重写一样的问题,也就是新数据如何处理?而两者的解决方案也是相同的,通过COW形成副本机制,新的数据会以副本的形式存在,而子进程会把原数据备份而不是备份最新的副本,这也是快照的“不变性”。

对比AOF与RDB

    AOF在两者之间更符合”日志“的角色,优点在于它是增量的,并且是顺序写入有更高的IO性能;另外AOF的配置更加灵活,可以保证强一致性,也可以牺牲一致性保证性能。缺点在于由于记录的是过程而不是数据结果,所以用于数据恢复或者数据迁移的过程比较长;另外每秒同步的开销也是很大的,加上重写的开销,AOF并不会低于RDB。

    而RDB的缺点在于它是一个全量备份的过程,因此每一次都是一次不小的开销,这个开销除了在主线程的fork,还有一个就是副本的内存占用,这个点其实是容易忽略的,如果在写入非常频繁的场景下,两次RDB之间由于COW产生的副本是实实在在的内存开销,在这个过程中会存在两份数据导致内存上涨,如果有Swap机制那么内存不够时就会被置换到磁盘中,如果没有则会直接OOM;另外对于数据一致性要求很高的场景,RDB并不适合,因为在两次RDB之间宕机会造成数据的丢失,出于性能的考虑,往往RDB的执行的频率不会像AOF一样每秒执行。而RDB的优点也很明显,由于它高度紧凑的数据存储方式,以及它存储的是面向数据本身的,所以它适合快速恢复数实例数据,适应容灾场景。

AOF与RDB的结合

    在Redis4中提出了AOF与RDB结合的方式,由于AOF本身是增量的,而RDB又是全量的,因此增量+全量可以结合两者的优点。结合以后AOF只需要记录两次RDB之间的记录即可,下一次RDB就会把快照重新记录下来。这样一来,数据恢复时可以先替换rdb文件然后重放aof文件可以达到秒级别数据一致性,也避免了大量AOF的重放操作。

    Redis5后默认开启了混合模式,具体的工作模式还是围绕我们上一节的AOF重写来实现,当触发重写时Redis会将内存数据以rdb的形式写入aof文件的开头,由于AOF重写时新来的操作是会在重写缓冲区的因此缓冲区的命令就是两次RDB之间的增量数据,混合模式的开关在配置文件中如下:

不知道大家还记不记得上一节我们手动执行bgrewriteaof触发重写后的AOF日志,我们再贴一下:

开头就有preamble,可见默认就开启了混合模式。

小结

    这一小节我们大致讲解了一下Redis中数据持久化的另一种方式:RDB,对比了AOF和RDB我们更加清楚了两者的不同,也明白了混合模式的工作方式,是如何将两者结合实现效益最大化的。

    Redis的数据可靠性保证我们就告一段落,这样看Redis在单机下既有了花样的数据结构保证了存储的多样性,也有了AOF和RDB保证了作为一个数据库的Crash Safe,而我们知道Redis属于键值数据库,键值数据库与传统关系型数据库最大的不同就是去关系,这也是NoSql数据库的最大特征,这也为分布式数据库做了铺垫,Redis作为分布式键值数据库,集群模式才是工业王牌,所以我们需要了解Redis是如何提供分布式服务的以及如何处理分布式系统的问题的,下期见~

Redis专栏合集

【专栏】01| Redis夜的第一章

【专栏】基础篇02| Redis 旁路缓存的价值

【专栏】基础篇03| Redis 花样的数据结构

【专栏】基础篇04| Redis 该怎么保证数据不丢失(上)

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

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

相关文章

基于java+ssm幼儿园教学网站管理系统vue-计算机毕业设计

项目介绍 要想做好幼升小的衔接工作,首先我们要明确小学生相对于幼儿园来说的不同之处。在幼儿园阶段,我们更多的是让小朋友做游戏,培养他们的学习兴趣等。而进入小学后,课程种类增加了,阅读信息不再是简单的图片&…

PHP房屋租售信息管理系统可以用wamp、phpstudy运行定制开发mysql数据库BS模式

一、源码特点 PHP房屋租售信息管理系统 是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库系统主要采用B/S模式开发,开发环境为PHP APACHE,数据库为mysql5.0,使用php语言开发 PHP房屋租售信…

kubernetes组件再认知

背景 之前学习k8s的各组件还是感觉不深入, 只停留在名字解释上面。总是不能深入理解,例如应用部署后kuber-proxy会在master 和node上添加什么样的iptables规则、部署一个应用的完整流程( 手画各组件功能并介绍10分钟以上 )、schedule具体是怎么调度的、limit reque…

计算机视觉|针孔成像,相机内外参及相机标定,矫正的重要性

计算机视觉读书笔记|相机内外参及相机标定,矫正的重要性 这篇博客将介绍针孔成像,透镜(弥补了针孔成像曝光不足成像速度慢的缺点,但引进了畸变,主要是径向畸变和切向畸变,径向畸变主要是离中心越远越弯曲&…

Tableau指标排行

2022年11月15日,深圳数据交易所举行揭牌暨数据交易成果发布活动。 文章目录前言一、整体数据排行二、数据排行TOP N三、根据需要也可以显示具体排名总结前言 分享Tableau指标排行制作过程中遇到的问题及其解决方式,供各位小伙伴参考。 一、整体数据排行…

谷粒学院(二) 讲师管理模块

一、讲师管理模块配置 1、在service下面service-edu模块中创建配置文件 2. resources目录下创建文件 application.properties # 服务端口 server.port8001 # 服务名 spring.application.nameservice-edu# 环境设置:dev、test、prod spring.profiles.activedev# my…

java基于ssm网上超市购物商城-计算机毕业设计

项目介绍 网上超市是商业贸易中的一条非常重要的道路,可以把其从传统的实体模式中解放中来,网上购物可以为消费者提供巨大的便利。通过网上超市这个平台,可以使用户足不出户就可以了解现今的流行趋势和丰富的商品信息,为用户提供…

MySQL8.0优化 - 锁 - 从数据操作的粒度划分:表级锁、页级锁、行锁

文章目录学习资料锁的不同角度分类锁的分类图如下从数据操作的粒度划分:表级锁、页级锁、行锁表锁(Table Lock)表级别的S锁、X锁意向锁(intention lock)自增锁(AUTO-INC锁)元数据锁(…

算法刷题介绍

算法刷题介绍 课程大纲 Python 作为实现语言。 快速排序算法 0 (nlogn) 实际工作中要根据实际情况选择最优解。 有可能没有完美方案,需要做平衡。 数据有啥特征? 举例:对一组数据进行排序 是否包含大量重复元素(三路快排&#x…

【微服务治理之监控APM】系统监控架构概述

APM 简介 APM 通常认为是 Application Performance Management 的简写,它主要有三个方面的内容,分别是 Logs(日志)、Traces(链路追踪)Metrics(报表统计)。 以后大家接触任何一个 APM 系统的时候,都可以从这三个方面去分析它到底是什么样的…

vue中scoped原理与样式穿透原理

是什么 在vue组件中的style标签上有一个特殊属性:”scoped“ 为什么 当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,通过该属性,可以使得组件之间的样式不互相污染。 怎么样实现的 1.为组件实例生成一个唯一…

[附源码]SSM计算机毕业设计智能视频推荐网站JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

codeforces:F. All Possible Digits【贪心 + 模拟进位】

目录题目截图题目分析ac code总结题目截图 题目分析 注意是只能再最后一位加我们要使得0到p - 1都出现至少一次统计出现的数字aset考虑最后一位pivot情况1:如果pivot前都出现了,就不用进位了,pivot只需要加到最大的未出现在aset的num即可情况…

【编程题】【Scratch二级】2022.09 小老鼠偷面包

小老鼠偷面包 1. 准备工作 (1)背景:Stars,绘制如下图所示的迷宫; (2)角色:Cat 2、Mouse1、Bread。 2. 功能实现 (1)Cat 2、Mouse1和Bread初始位置和方向如…

机器人C++库(12) Robotics Library 之路径规划算法:PRM、RRT、EET算法

机器人C库(12)Robotics Library 之路径规划算法:PRM、RRT、EET算法 RL库的运动规划(rl::plan)模块集成了以下经典的路径规划算法: PRM算法:概率路线图算法RRT算法:快速探索随机树算法EET算法:搜索树算法-基…

牧场系统设计与实现-计算机毕业设计源码+LW文档

关键代码 package com.example.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.huto…

japonensisjava乱码_Java乱码问题原因及解决方案

一. java乱码乱码问题解决思路,java乱码分为以下几种 1. 请求乱码 如果是在请求过程中发生的乱码,有可能是以下几种情况: 参数放在 URL 地址中乱码; 参数在请求体中乱码; 数据库本身乱码; 数据从 Java 应用程序传入数据库的过程中乱码。 2. 响应乱码 如果是响应乱码,那…

Go语言学习(八)-- Gin入门

Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快。Gin 最擅长的就是 Api 接口的高并发,如果项目的规模不大,业务相对简单,这个时候我们 也推荐您使用 Gin。 当某个接口的性能遭到较大挑战的时候,这…

Prometheus监控案例

一:环境规划: 主机名主机地址角色node4192.168.188.114prometheus客户端node5192.168.188.115prometheus服务端 二. 监控远程linux主机: 1. 解压node_exporter压缩包: [rootnode4 ~]# tar xf node_exporter-1.3.1.linux-amd64…

RT-Thread 下的文件内容对比 MSH shell cmd 命令实现方法

前言 在使用 RT-Thread 时,需要对两个文件的内容进行比较,顺手写了一个测试的 MSH shell 命令,经过优化,发现功能可以使用 RT-Thread 下支持多种文件系统,如FAT等,可以通过 USB、串口 的 Ymodem 等协议把文…