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.结构体指针参数传递
目录 一.结构体指针参数传递 二.视频教程 一.结构体指针参数传递 结构体指针也可以作为参数传递,相对于结构体变量参数传递,结构体指针变量作为函数参数传递速度更快,效率更高。 举例: #include <stdio.h> #include <…...
面向对象编程与Scala:掌握核心概念与应用
面向对象编程与Scala:掌握核心概念与应用 1. 引言 Scala 是一种融合了面向对象编程(OOP)和函数式编程(FP)特性的编程语言。它为开发者提供了强大的工具来创建高效且灵活的软件。面向对象编程是一种编程范式ÿ…...
《Advanced RAG》-07-探索 RAG 中表格数据的处理方案
摘要 本文详细讨论了实现 Retrieval-Augmented Generation(RAG)时对表格进行处理的挑战,特别是在非结构化文档中自动准确地提取和理解表格信息。 首先介绍了RAG中管理表格的关键技术,包括表格解析和索引结构设计。 接着࿰…...
Dubbo源码深度解析(二)
接着《Dubbo源码深度解析(一)》继续讲,上篇博客主要讲Dubbo提供的三个注解的作用,即:EnableDubbo、DubboComponentScan、EnableDubboConfig。其中后两个注解是在EnableDubbo上的,因此在启动类上加上EnableDubbo注解,等…...
RocketMQ 的高可用性:主从复制与多副本保证
RocketMQ 是一款开源的分布式消息队列系统,广泛应用于大规模分布式应用中。高可用性是 RocketMQ 的核心特性之一,通过主从复制和多副本保证,RocketMQ 能够确保消息的可靠传递和系统的高可用性。 什么是高可用性? 高可用性&#…...
Linux系统驱动(四)自动创建设备节点
自动创建设备节点 (一)创建设备节点的机制 1. mknod 将驱动编译到内核中,在内核启动时驱动自动被安装执行 2.devfs(2.4内核) 3. udev(2.6内核至今) 注:hotplug — 热插拔 &…...
Webpack、Vite区别知多少?
前端的项目打包,我们常用的构建工具有Webpack和Vite,那么Webpack和Vite是两种不同的前端构建工具,那么你们又是否了解它们的区别呢?我们在做项目时要如何选择呢? 一、工具定义 1、Webpack:是一个强大的静态模块打包工…...
《剑指编程之巅:大学新生,以诗心驭代码》
《剑指编程之巅:大学新生,以诗心驭代码》 月华如水,洒落书窗,吾辈学子,正逢盛世,编程之术,已成必修之课。然则,编程语言如繁星点点,学习资源浩瀚如海,新生初…...
【八股文】网络基础
1.简述一下TCP和UDP的区别? 特性TCP(Transmission Control Protocol)UDP(User Datagram Protocol)连接类型面向连接,需要建立三次握手连接无连接,发送数据无需建立连接数据传输提供可靠的数据传…...
Nginx进阶-常见配置(一)
一、nginx Proxy 反向代理 1、代理原理 反向代理产生的背景: 在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的接入请求蜂拥而入时,会造成服务器忙不过来的局面,…...
九/十:C语言-扫雷游戏实现与函数递归
九:数组和函数实践:扫雷游戏 1.扫雷游戏的分析和设计 (1)扫雷游戏功能说明: 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现暂停或者退出游戏扫雷的游戏界面是9*9的格子默认随机布置10个雷可以排查雷࿱…...
【Android Studio】gradle文件、配置、版本下载、国内源(gradle版本以及gradle-plugin版本)
文章目录 AS查看gradle-plugin版本及gradle版本(图形)查看gradle-plugin版本及gradle版本(配置文件)配置文件分析解决gradle下载失败、版本错乱等问题。 Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的自动化构建工具&…...
主要的软件设计模式及其在Kotlin中的实现示例
软件设计模式(Software Design Patterns)是面向对象设计中常用的解决方案,它们为常见的软件设计问题提供了一些被证明有效的解决方案。以下是一些主要的软件设计模式及其在Kotlin中的实现示例。 创建型模式(Creational Patterns&…...
FFmpeg音频重采样基本流程
目录 流程概述用到的APItipsdemo样例附录 - SwrContext结构体字段 流程概述 音频重采样的基本流程为: 申请重采样器上下文设置重采样去上下文的参数初始化重采样器申请数据存放的缓冲区空间进行重采样 注意,要先设置参数再对重采样器初始化 用到的API…...
无人机无人车固态锂电池技术详解
随着无人机和无人车技术的飞速发展,对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表,正逐步从实验室走向市场,为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池,固态锂电池在能量密度…...
ElementUI元件库在Axure中使用
一、ElementUI元件库介绍 ElementUI 是一套为开发者、UI/UX设计师和产品经理准备的基于Vue 2.0的桌面端组件库。它以其优雅的设计和丰富的组件,极大地提升了Web应用的开发效率与用户体验。ElementUI的组件设计精致且符合现代UI规范,包括按钮、表单、弹窗…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
