redis面试(四)持久化

news2024/9/22 4:07:42

什么是持久化?

由于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文件来进行缺失数据的补充。

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

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

相关文章

Java中interrupted()与isInterrupted()的区别

Java中interrupted()与isInterrupted()的区别 1、interrupted()方法1.1 示例 2、isInterrupted() 方法2.1 示例 3、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java多线程编程中&a…

手持式气象站:科技赋能精准气象观测

在自然界与人类社会的交织中,气象条件始终扮演着至关重要的角色。无论是农业生产、城市建设,还是日常生活、户外活动,都离不开对天气变化的准确预测和及时响应。随着科技的飞速发展,气象观测设备也迎来了变化,其中&…

什么是人工智能 (AI)

1955年9月,达特茅斯学院(Dartmouth College)年轻的数学助理教授约翰麦卡锡(John McCarthy)大胆提出,“原则上,学习的各个方面或智力的任何其他特征都可以被精确地描述,以至于可以制造…

使用Python3脚本检查节假日并通过企业微信发送每日信息

文章目录 简介环境配置企业微信机器人创建群聊设置机器人信息 脚本详解导入必要的库获取节假日信息判断是否为工作日或节假日获取天气预报获取每日一句发送消息到微信主函数 加入定时任务总结完整代码 简介 在日常工作和生活中,自动化任务可以帮助我们节省大量时间…

吃惊!这个Windows双系统方法逆天了|UEFI篇

前言 最近小白在折腾别的系统教程,偶然间发现居然有一个很nice的Windows双系统教程。于是于是,果断尝试了一下,发现真的很可行! 这个双系统的办法并不需要使用到WinPE系统,因此并不需要使用到U盘,只需要在…

科普文:微服务之SpringBoot性能优化器动态线程池【Dynamic-Tp】特性和源码解读

一、简述 gitee地址:https://gitee.com/yanhom/dynamic-tp github地址:https://github.com/lyh200/dynamic-tp dynamic-tp是一个轻量级的动态线程池插件,它是一个基于配置中心的动态线程池,线程池的参数可以通过配置中心配置进…

数的三次方根

题目 给定一个浮点数 n,求它的三次方根。 输入格式 共一行,包含一个浮点数 n。 输出格式 共一行,包含一个浮点数,表示问题的解。 注意,结果保留 6 位小数。 数据范围 输入样例: 1000.00 输出样例&a…

征服数据结构中的时间和空间复杂度

目录 时间复杂度推导大O方法求解时间复杂度的方法普通顺序结构单循环双循环递归Master定理(主定理)递归树方法 空间复杂度 一个算法的好坏根据什么来判断呢?有两种一种是时间效率,一种是空间效率。时间效率也可称为时间复杂度&…

内网穿透--LCX+portmap转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网,然后由于私网IP的缘故,公网 无法直接访问内部web服务器主机,通过内网其它主机做代理,穿透访问内网web 服务器主机 实验设备 1. 路由器、交换机各一台 2. 外网 kali 一台&…

网络层和数据链路层的理解

文章目录 网络层IP协议网段划分IP地址数量问题NAT技术DNSICMP协议 数据链路层以太网MTU的影响ARP协议 网络层 作用: 在网络环境中确定消息传输的路径。 主要协议: IP协议。 IP协议 IP协议的基本概念:凡是入网的机器都会有一个IP地址&#…

手机上音乐如何转换成MP3格式?分享5款音频格式转换APP

手机上音乐如何转换成MP3格式?相信很多外出办公或者不经常使用电脑的工作人士,学生党,媒体从业者都有这样的疑惑和需求。不同设备和应用可能支持不同的音频格式,导致某些情况下需要将音乐文件转换为MP3格式以确保兼容性。下面&…

24暑假算法刷题 | Day27 | 贪心算法 I | LeetCode 455. 分发饼干,376. 摆动序列,53. 最大子数组和

目录 455. 分发饼干题目描述题解 376. 摆动序列题目描述题解 53. 最大子数组和题目描述题解 455. 分发饼干 点此跳转题目链接 题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i&#x…

【Mind+】掌控板入门教程03 节日的祝福

在节日的时候,我们通常会送朋友或者家人一张贺卡表达美好的祝福。随着科技的发展,我们已经可以通过手机聊天工具发送一封电子贺卡。电子贺卡相当于把祝福做成了一个小动画,它环保方便,生动有趣。今天就让我们用掌控板来制作一份电…

Java | Leetcode Java题解之第318题最大单词长度乘积

题目&#xff1a; 题解&#xff1a; class Solution {public int maxProduct(String[] words) {Map<Integer, Integer> map new HashMap<Integer, Integer>();int length words.length;for (int i 0; i < length; i) {int mask 0;String word words[i];in…

Java | Leetcode Java题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; class Solution {public int bulbSwitch(int n) {return (int) Math.sqrt(n 0.5);} }

C++客户端Qt开发——多线程编程(二)

多线程编程&#xff08;二&#xff09; ③线程池 Qt中线程池的使用 | 爱编程的大丙 1>线程池 我们使用线程的时候就去创建一个线程&#xff0c;这样实现起来非常简便&#xff0c;但是就会有一个问题&#xff1a;如果并发的线程数量很多&#xff0c;并且每个线程都是执行…

Java:Thread类以及线程状态

文章目录 Thread类等待一个线程 - join()获取当前线程的引用sleep 线程状态 Thread类 等待一个线程 - join() 操作系统,针对多个线程的执行,是一个"随机调度,抢占式执行“的过程. 线程等待就是在确定两个线程的"结束顺序”. 我们无法确定两个线程调度执行的顺序,但…

找工作,如何写一份好的简历? 附简洁大方的简历模板

一份精心制作的简历对给潜在雇主留下积极的第一印象至关重要。这是你展示技能、经验和成就的第一机会&#xff0c;因此制作一份出色的简历至关重要。下面是一个指南&#xff0c;帮助你创建一份出色的简历&#xff0c;参考一个专业的模板。 1. 联系信息 在简历顶部提供你的联系…

设计模式 - Singleton pattern 单例模式

文章目录 定义单例模式的实现构成构成UML图 单例模式的六种实现懒汉式-线程不安全懒汉式-线程安全饿汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现 总结其他设计模式文章&#xff1a;最后 定义 单例模式是一种创建型设计模式&#xff0c;它用来保证一个类只有一个实…

MATLAB优化模型(4)

一、前言 在MATLAB中&#xff0c;你可以使用内置的遗传算法(Genetic Algorithm)、模拟退火(Simulated Annealing)等优化工具箱函数&#xff0c;或者编写自定义代码来实现(Ant Colony Optimization, ACO) 蚁群算法和粒子群算法(Particle Swarm Optimization, PSO)。以下是一些基…