当前位置: 首页 > news >正文

redis面试(四)持久化

什么是持久化?

由于redis是基于内存操作的轻量型数据库,所以如果发生宕机重启这种事情,存储的数据就会直接丢失,如果在里面存储了没有备份的数据,那么确实会对我们的业务造成一定影响。 所以我们要通过持久化的手段,将数据存入磁盘中,只要进入了磁盘,就不怕主机宕机重启。这部分数据除非主动删除,是可以一直存在,这就是持久化。

什么场景需要持久化?

一般情况下来说,我们使用redis只是给数据库加一层防护,防止大量的流量直接打到数据库导致数据库宕机,进而引发系统整体瘫痪。
在真正的业务处理中,大量访问的数据其实都是一些热点数据,那么这些热点数据我们做一层缓存,就可以拦截大量的流量,不需要将请求再发送给数据库。 减少了与数据库的链接,也就是减少了大量的IO耗时。 那么也就做到了单次请求的耗时减少,自然而然的 QPS就能整体提升。
扯得远了,说回到redis,在上面的单纯做数据缓存的场景,其实是没有必要进行数据持久化。 因为就算系统宕机重启,查询不到数据的时候,无非是去数据库里面再捞一把,重新存入缓存中就可以了,这部分数据是天然就在数据库里面持久化过的。

那说了这么多,到底什么场景才需要? 我给的答案是,除非是真的将redis当成所有业务数据的最终存储位置,所有的业务流转都是基于redis来操作,没有其他任何天然持久化的数据库如:mysql、es等等。 这个时候才是一定需要持久化的。
只要是数据可以通过其他手段重新更新到redis中的话,就没有必要在redis进行持久化操作。

哦,有的朋友可能会说,那总有些业务数据是先更新到缓存中,然后再更新到数据库中的吧,如果这个时间差里面,数据丢失了怎么办? 对于这种,redis是可以做分布式多节点备份,主节点宕机了,副节点一样会有一份备用数据。

又有朋友说了,那如果所有节点都宕机了,怎么办? 这种场景,我们要想一下,到底是丢失了多久的数据? 从数据进入缓存,到数据异步落库,这个时间差真的会很久吗?如果这个过程中要保证数据100%不丢失的话,redis可以做到,但是! 这个过程的产生的耗时,与直接进入数据库还有区别吗? 我们使用redis不就是为了提升性能对吧。

可能还有朋友说了,那如果真的是比较重要的数据,又对性能要求比较高,比如最常见的秒杀系统,可以是基于reids来处理的,如果这个过程中数据丢失了,那不就会造成秒杀系统出问题么。 对于这种,我只想说,如果在推广秒杀的这么重要的时刻,还能发生redis宕机的问题,最好是转行吧,别做商家系统了,会赔死的。
这些问题确实是在面试中遇到过

言归正传,但是redis既然有这个持久化的功能,那一定就是有人会问的,我们就来剖析一下

持久化策略

持久化的策略简单来说分为两种,AOF 和 RDB
AOF是一种热备份,就是在我们不断的更新数据的时候,他会不断的将我们更新的数据持久化到磁盘中,这个基本上时间差就是ms级别的。 缺点就是可能会对我们更新reids产生一定性能上的影响。
RDB是一种定时冷备份,就是每隔一段时间,将数据整体备份一次,备份的间隔期间是不会对我们的请求造成影响。缺点就是在备份的过程中可能会影响我们的更新操作,并且会丢失一定时间内的数据。

RDB

全称是Redis Database Backup file,直译是redis数据备份,我们称之为数据快照。

自动备份:
在配置文件中配置,需要注意的是,这种快照备份,是会阻塞redis服务器,不能处理其他命令,直到备份完成

# 900秒内至少1个键被修改则进行快照
save 900 1# 300秒内至少10个键被修改则进行快照
save 300 10# 60秒内至少10000个键被修改则进行快照
save 60 10000

手动备份:
执行命令,bgsave 这个命令是手动开启一个子进程,过程中不会阻塞其他的reids命令

RDB备份的流程
备份数据的时有一个fork(创建)一个子进程的动作,将主进程中的所有内容全部复制,然后进行一个数据复制备份的操作,这个fork是什耗费时间的。 所以如果性能要求比较高的话,建议可以关闭默认的save,在服务器上用shell写一个定时器,每天的固定时间去执行bgsave命令,可以提高系统的性能。缺点就是可能会丢失一定的数据。
在这里插入图片描述

AOF

全称是Append Only File ,是一个命令追加保存的策略。
将每个命令都存储到aof文件中,恢复数据的时候是进行命令回放来。

AOF的配置参数:

  • appendonly:是否开启AOF持久化策略,默认为no。
  • appendfilename:AOF文件的名字,默认为"appendonly.aof"。
  • appendfsync:AOF文件的同步模式,有always、everysec、no三种模式。
  • no-appendfsync-on-rewrite:在AOF重写时,是否停止同步,默认为no。
  • auto-aof-rewrite-percentage:AOF文件长度增长的百分比,超过该百分比进行AOF文件重写。默认100
  • auto-aof-rewrite-min-size:AOF文件重写触发的最小文件体积。默认64mb

同时开启aof和rdb策略的话,优先使用aof

备份流程:

  • 客户端发送写操作命令给Redis服务器。
  • 服务器接收到命令,将其写入内存中,并将该命令添加到AOF缓冲区。
  • AOF缓冲区根据策略可能会被同步到硬盘上的AOF文件中。
  • Redis服务器定期检查AOF文件的大小,并进行AOF重写操作,即压缩AOF文件。
  • 如果Redis服务器异常,会从AOF文件中读取命令进行数据恢复。

AOF重写操作 aof rewrite
设置了auto-aof-rewrite-percentage或者auto-aof-rewrite-min-size会触发重写操作。
size配置很清晰,意思是超过多大就要重写。
percentage的意思是,本次的文件大小,和上次的文件大小对比,超过百分之多少就进行重写。

为什么要重写aof文件
因为命令是不断接收的,所以文件肯定也是不断的增大,如果过大的话一定会对cpu造成负担,IO性能下降,内存消耗过大。所以就要进行文件瘦身操,将命令梳理一遍。 比如已经del的数据,那所相关的命令肯定就没有存在的必要了。

重写的时候也是fork出来一个子进程,然后扫描当前reids所有的键值对,生成一份新的aof文件。
这个过程中redis是没有阻塞,还在不断的接收新的命令,这些新的命令会存在aof缓冲区,等到新的aof完成的话,再将这些新命令存入新的aof文件中

总结

最优的持久化手段就是,AOF和RDB配合使用,因为AOF文件命令恢复数据是比较慢的。

  • 定时的通过shell来进行定时的rdb快照备份。
  • 然后再通过aof文件来进行缺失数据的补充。

相关文章:

redis面试(四)持久化

什么是持久化? 由于redis是基于内存操作的轻量型数据库,所以如果发生宕机重启这种事情,存储的数据就会直接丢失,如果在里面存储了没有备份的数据,那么确实会对我们的业务造成一定影响。 所以我们要通过持久化的手段&a…...

构建数据桥梁:Pandas如何简化API到DataFrame的转换

在数据科学的广阔天地中,API如同一把钥匙,为我们打开了通往丰富数据资源的大门。无论是追踪最新的股市动态,还是分析社交媒体趋势,API都能提供我们需要的实时数据。今天,我们将一起探索如何利用Python的pandas库&#…...

echarts制作grafana 面板之折线图

最近有需求需要制作grafana 来实现自己的需求,于是开始研究 实现效果如下 实现代码 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom, dark); var option;function getLast30Days() {let da…...

技术男的审美反击:UI配置化新纪元

之前常常被甲方的领导说,我们全是一群钢铁直男,一点不懂审美,其实我们心里边想的 “您说得对啊!!!!” 这个可能和理工科有关系吧,理工男好像都差不多,所以这次我们就把很…...

73.结构体指针参数传递

目录 一.结构体指针参数传递 二.视频教程 一.结构体指针参数传递 结构体指针也可以作为参数传递&#xff0c;相对于结构体变量参数传递&#xff0c;结构体指针变量作为函数参数传递速度更快&#xff0c;效率更高。 举例&#xff1a; #include <stdio.h> #include <…...

面向对象编程与Scala:掌握核心概念与应用

面向对象编程与Scala&#xff1a;掌握核心概念与应用 1. 引言 Scala 是一种融合了面向对象编程&#xff08;OOP&#xff09;和函数式编程&#xff08;FP&#xff09;特性的编程语言。它为开发者提供了强大的工具来创建高效且灵活的软件。面向对象编程是一种编程范式&#xff…...

《Advanced RAG》-07-探索 RAG 中表格数据的处理方案

摘要 本文详细讨论了实现 Retrieval-Augmented Generation&#xff08;RAG&#xff09;时对表格进行处理的挑战&#xff0c;特别是在非结构化文档中自动准确地提取和理解表格信息。 首先介绍了RAG中管理表格的关键技术&#xff0c;包括表格解析和索引结构设计。 接着&#xff0…...

Dubbo源码深度解析(二)

接着《Dubbo源码深度解析(一)》继续讲&#xff0c;上篇博客主要讲Dubbo提供的三个注解的作用&#xff0c;即&#xff1a;EnableDubbo、DubboComponentScan、EnableDubboConfig。其中后两个注解是在EnableDubbo上的&#xff0c;因此在启动类上加上EnableDubbo注解&#xff0c;等…...

RocketMQ 的高可用性:主从复制与多副本保证

RocketMQ 是一款开源的分布式消息队列系统&#xff0c;广泛应用于大规模分布式应用中。高可用性是 RocketMQ 的核心特性之一&#xff0c;通过主从复制和多副本保证&#xff0c;RocketMQ 能够确保消息的可靠传递和系统的高可用性。 什么是高可用性&#xff1f; 高可用性&#…...

Linux系统驱动(四)自动创建设备节点

自动创建设备节点 &#xff08;一&#xff09;创建设备节点的机制 1. mknod 将驱动编译到内核中&#xff0c;在内核启动时驱动自动被安装执行 2.devfs&#xff08;2.4内核&#xff09; 3. udev&#xff08;2.6内核至今&#xff09; 注&#xff1a;hotplug — 热插拔 &…...

Webpack、Vite区别知多少?

前端的项目打包&#xff0c;我们常用的构建工具有Webpack和Vite&#xff0c;那么Webpack和Vite是两种不同的前端构建工具,那么你们又是否了解它们的区别呢&#xff1f;我们在做项目时要如何选择呢&#xff1f; 一、工具定义 1、Webpack&#xff1a;是一个强大的静态模块打包工…...

《剑指编程之巅:大学新生,以诗心驭代码》

《剑指编程之巅&#xff1a;大学新生&#xff0c;以诗心驭代码》 月华如水&#xff0c;洒落书窗&#xff0c;吾辈学子&#xff0c;正逢盛世&#xff0c;编程之术&#xff0c;已成必修之课。然则&#xff0c;编程语言如繁星点点&#xff0c;学习资源浩瀚如海&#xff0c;新生初…...

【八股文】网络基础

1.简述一下TCP和UDP的区别&#xff1f; 特性TCP&#xff08;Transmission Control Protocol&#xff09;UDP&#xff08;User Datagram Protocol&#xff09;连接类型面向连接&#xff0c;需要建立三次握手连接无连接&#xff0c;发送数据无需建立连接数据传输提供可靠的数据传…...

Nginx进阶-常见配置(一)

一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景&#xff1a; 在计算机世界里&#xff0c;由于单个服务器的处理客户端&#xff08;用户&#xff09;请求能力有一个极限&#xff0c;当用户的接入请求蜂拥而入时&#xff0c;会造成服务器忙不过来的局面&#xff0c…...

九/十:C语言-扫雷游戏实现与函数递归

九&#xff1a;数组和函数实践&#xff1a;扫雷游戏 1.扫雷游戏的分析和设计 &#xff08;1&#xff09;扫雷游戏功能说明&#xff1a; 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现暂停或者退出游戏扫雷的游戏界面是9*9的格子默认随机布置10个雷可以排查雷&#xff1…...

【Android Studio】gradle文件、配置、版本下载、国内源(gradle版本以及gradle-plugin版本)

文章目录 AS查看gradle-plugin版本及gradle版本&#xff08;图形&#xff09;查看gradle-plugin版本及gradle版本&#xff08;配置文件&#xff09;配置文件分析解决gradle下载失败、版本错乱等问题。 Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的自动化构建工具&…...

主要的软件设计模式及其在Kotlin中的实现示例

软件设计模式&#xff08;Software Design Patterns&#xff09;是面向对象设计中常用的解决方案&#xff0c;它们为常见的软件设计问题提供了一些被证明有效的解决方案。以下是一些主要的软件设计模式及其在Kotlin中的实现示例。 创建型模式&#xff08;Creational Patterns&…...

FFmpeg音频重采样基本流程

目录 流程概述用到的APItipsdemo样例附录 - SwrContext结构体字段 流程概述 音频重采样的基本流程为&#xff1a; 申请重采样器上下文设置重采样去上下文的参数初始化重采样器申请数据存放的缓冲区空间进行重采样 注意&#xff0c;要先设置参数再对重采样器初始化 用到的API…...

无人机无人车固态锂电池技术详解

随着无人机和无人车技术的飞速发展&#xff0c;对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表&#xff0c;正逐步从实验室走向市场&#xff0c;为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池&#xff0c;固态锂电池在能量密度…...

ElementUI元件库在Axure中使用

一、ElementUI元件库介绍 ElementUI 是一套为开发者、UI/UX设计师和产品经理准备的基于Vue 2.0的桌面端组件库。它以其优雅的设计和丰富的组件&#xff0c;极大地提升了Web应用的开发效率与用户体验。ElementUI的组件设计精致且符合现代UI规范&#xff0c;包括按钮、表单、弹窗…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...