【Redis】Redis作为缓存
【Redis】Redis常见面试题(2)
文章目录
- 【Redis】Redis常见面试题(2)
- 1. 缓存
- 2. Redis作为缓存
- 2.1 缓存雪崩
- 2.2 缓存穿透
- 2.3 缓存击穿
- 2.4 缓存雪崩、缓存穿透、缓存击穿的区别
- 2.5 缓存预热
- 2.6 如何保证缓存和MySQL双写一致
【Redis】Redis常见面试题(2)
1. 缓存
缓存在计算机系统中有着重要的作用,它可以显著提高系统的性能和响应速度
- 提升系统性能: 缓存将常用的数据或计算结果存储在高速的存储介质中,如内存,以便快速地响应请求。通过减少对慢速存储介质(如硬盘或数据库)的访问次数,可以降低响应延迟,提高系统的吞吐量和效率
- 减轻后端压力: 通过缓存,系统可以减少对后端资源的频繁访问,降低数据库或其他外部服务的负载。这样可以节省计算资源,提高系统的可扩展性和稳定性
- 改善用户体验: 缓存能够加速应用程序的响应速度,从而提供更好的用户体验。用户可以更快地获取所需的数据或结果,减少等待时间,提高用户满意度
就以我们的大脑为例
-
5的阶乘是120,一般不需要一直拆成
5*4*3*2*1
去算,而是直接答120,因为我们大脑吧5的阶乘是120保存到“缓存”了! -
再比如,你是个数学白痴,四道选择题一道不会,但是你在测试之前看到了答案,答案是ABCD,你记住了,放在“缓存”里;测试的时候,你直接写答案,四道选择题满分;下次遇到同样的四道选择题,题目和选项一模一样,一些你还记得答案,但是一些忘记了,“忘记了”也就是“缓存的过期”
2. Redis作为缓存
由于Redis高性能,多种数据结构,持久化支持的特性,再加上天生支持分布式,作为分布式机的缓存,担得起这个责任~
下面是Redis作为缓存常见的一些知识点
2.1 缓存雪崩
缓存雪崩是指在短时间内,由大量缓存同时过期,导致大量的请求直接访问查询数据库而不是缓存,从而对数据库造成巨大的压力,严重的情况下可能会导致数据库宕机!
缓存的存在,减少了请求访问查询数据库的频率,提高效率,减低数据库压力,过期后,“没人兜底了”
正常情况下:
缓存雪崩:
解决:
-
加锁排队,缺点就是增加系统的响应时间,降低系统吞吐量,牺牲一点用户体验
-
随机化过期时间,极大避免了同时过期这个事件的发生,系统常用的方式;甚至可以不设置过期时间,但对硬件要求高
-
设计二级缓存,Redis这一层防线沦陷后,二级缓存挺身而出
2.2 缓存穿透
缓存穿透指的是查询数据库和缓存都没有数据,因为数据库查询无数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透
- 可以理解为每次都无视缓存,缓存一直没被存数据,缓存没有其作用
2.3 缓存击穿
缓存击穿指的是某个热点缓存,在某一时刻恰好失效了,然后此时刚好有大量的并发请求,此时这些请求将会给数据库造成巨大的压力
- 就像被击穿了个洞,一个缺口,“流量大,水压高”形成一道强硬的“水刀”刺向数据库
- 而缓存雪崩则是水坝直接塌了,涌了下来
相比于缓存穿透,击穿的严重程度显然更高
解决方案:
- 加锁排队
- 设置永不过期,既然是热点缓存,它配永不过期!
2.4 缓存雪崩、缓存穿透、缓存击穿的区别
-
缓存穿透是因为一直没有缓存数据导致的问题
-
缓存击穿是因为某个热点缓存失效而导致的问题
-
缓存血本是因为同时又大量的缓存失效所带来的问题
2.5 缓存预热
是一个优化手段,就是应用程序启动或缓存失效之后,主动将热点数据加载到缓存中的策略
- 这样,在实际请求到达应用程序时,热点数据已经存在于缓存中,从而减少了缓存未命中的情况,提高了应用程序的响应速度
2.6 如何保证缓存和MySQL双写一致
可以采用以下几种方法:
- 读取优先
- 在读取数据时,优先从Redis缓存中读取,如果缓存中不存在,则从MySQL数据库读取,并将数据写入Redis缓存。这样可以确保读取到的数据都是最新的,避免缓存中的脏数据
- 更新同步
- 在更新数据时,先更新MySQL数据库,然后再更新Redis缓存。这样可以避免数据库和缓存中的数据不一致
- 使用队列
- 通过将更新操作写入队列中,然后异步地从队列中获取操作并依次执行更新操作,先更新MySQL数据库,然后再更新Redis缓存。这样可以保证更新操作的顺序一致性,并减少数据库和缓存的并发写入冲突
- 使用事务
- 在支持事务的数据库中,可以使用数据库事务来同时更新MySQL和Redis。当更新MySQL数据库时,在同一个事务中也更新Redis缓存。如果更新Redis缓存失败,可以回滚数据库事务,确保数据的一致性。
- 定时刷新
- 设置一个定时任务,在一定时间间隔内将MySQL数据库中的数据同步到Redis缓存中,保持数据的一致性。可以根据业务需求设置合适的刷新时间间隔
需要注意的是,以上方法会增加系统的复杂性和延迟
- 因此需要根据具体的业务场景和性能要求做出权衡和选择
- 另外,使用缓存和数据库作为双写一致性解决方案时,也需要考虑缓存和数据库的高可用性和容错机制,以确保整个系统的可靠性
文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆!
相关文章:

【Redis】Redis作为缓存
【Redis】Redis常见面试题(2) 文章目录 【Redis】Redis常见面试题(2)1. 缓存2. Redis作为缓存2.1 缓存雪崩2.2 缓存穿透2.3 缓存击穿2.4 缓存雪崩、缓存穿透、缓存击穿的区别2.5 缓存预热2.6 如何保证缓存和MySQL双写一致 【Redis…...

IDEA(2023)解决运行乱码问题
😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:无 🌼…...

零基础学前端(二)用简单案例去理解 HTML 、CSS 、JavaScript 概念
该篇适用于从零基础学习前端的小白 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 一、导言 HTML,CSS,JavaScript 都是单独的语言;他们构成前端技术基础; (1)HTM…...

线性矩阵不等式(LMI)在控制理论中的应用
目录 (一)Matlab中的LMI处理工具包 (二)为什么LMI成为控制理论领域重要工具? (三)LMI在与Lyapunov不等式的关系 (1)线性矩阵不等式 (2)线性矩阵…...

如何在Python爬虫程序中使用HTTP代理?
在进行网络爬虫时,我们经常需要使用代理服务器来隐藏自己的真实IP地址,以避免被目标网站封禁或限制访问。本文将介绍如何将HTTP代理配置到Python爬虫程序中使用。 什么是HTTP代理? HTTP代理是一种网络代理,它充当客户端和服务器之…...

ARM架构指令集--专用指令
四、状态寄存器专用指令 CPSR寄存器-N Z C V T为0时 为ARM状态 F为0时 为开启FIQ状态 I为0时 为开启IRQ状态 图1 图2 一开始都是SVC指令,因为在操作系统启动的时候,在做一些初始化的操作,不允许被打断 图3 复位后CPSR寄存器为0xD3--…...
免费IP类api接口:含ip查询、ip应用场景查询、ip代理识别、IP行业查询...
免费IP类api接口:含ip查询、ip应用场景查询、ip代理识别… IP归属地-IPv6区县级:根据IP地址(IPv6版本)查询归属地信息,包含国家、省、市、区县和运营商等信息。IP归属地-IPv6城市级:根据IP地址(…...
Android Studio 中AGP ,Gradle ,JDK,SDK都是什么?
当进行 Android 开发时,以下是关键概念和工具的解释: Android Gradle Plugin: Android Gradle Plugin 是一个由 Google 提供的构建工具,它与 Gradle 配合使用来构建和打包 Android 应用。它提供了一组任务和功能,使开发…...

算法通关18关 | 回溯模板如何解决复原IP问题
18关的前几篇文章看过之后,对回溯的模板问题基本解题思路就知道了,就是固定的for循环问题,外层for循环控制横向,递归控制纵向,还要考虑撤销操作和元素是否能被重复利用问题,重复利用的情景较少,…...

Layui快速入门之第五节 导航
目录 一:基本概念 导航依赖element模块 API 渲染 属性 事件 二:水平导航 常规用法: 三:垂直导航 四:侧边垂直导航 五:导航主题 六:加入徽章等元素 七:面包屑导航 ps&a…...
使用分支——Git Checkout
这篇文章写的挺好; https://zhuanlan.zhihu.com/p/465954849 这里要注意,git 新的命令,通过 git switch 切换分支,虽然git checkout 分支 还可以用; 游离状态的HEADS 在我们已经见识到git checkout命令对于分支的三…...

【2023】数据挖掘课程设计:基于TF-IDF的文本分类
目录 一、课程设计题目 基于TF-IDF的文本分类 二、课程设计设置 1. 操作系统 2. IDE 3. python 4. 相关的库 三、课程设计目标 1. 掌握数据预处理的方法,对训练集数据进行预处理; 2. 掌握文本分类建模的方法,对语料库的文档进行建模…...

java.lang.NoSuchMethodError: java.lang.reflect.Field.trySetAccessible()Z
java.lang.NoSuchMethodError: java.lang.reflect.Field.trySetAccessible()Z 将JDK升级为11即可。 File --Project Structure – SDK Location --Gradle Setting --Gradle JDK 选择11...
如何使用SQL系列 之 如何在MySQL中使用存储过程
引言 通常,当使用关系型数据库时,你直接在应用程序代码中发出单独的结构化查询语言(SQL)查询来检索或操作数据,如SELECT、INSERT、UPDATE或DELETE。这些语句直接作用于并操作底层数据库表。如果相同的语句或一组语句中使用多个应用程序访问同…...

用 Github Codespaces 免费搭建本地开发测试环境
如何丝滑地白嫖一个本地开发环境?怎么新建一个代码空间? 1:通过Github网页新建2:通过VSCode插件新建 为代码创建相应的开发测试环境 如何丝滑地白嫖一个本地开发环境? 使用Codespaces为开发者解决这样的痛点…...

PyTorch实战-实现神经网络图像分类基础Tensor最全操作详解(一)
目录 前言 一、PyTorch数据结构-Tensor 1.什么是Tensor 2.数据Tensor使用场景 3.张量形态 标量(0D 张量) 向量(1D 张量) 矩阵(2D张量) 3D 张量与高维张量 二、Tensor的创建 1. 从列表或NumPy数组创建 2. 使用特定的初始…...

第29章_瑞萨MCU零基础入门系列教程之改进型环形缓冲区
本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…...
如何搭建一个react项目(详细介绍)
要搭建一个基本的 React 项目,你需要执行以下步骤。在开始之前,请确保你已经安装了 Node.js 和 npm(Node 包管理器)。 搭建一个React项目 1,创建项目目录2,初始化项目3,安装 React 和 ReactDOM4…...
ActiveMQ用法
ActiveMQ 和 JMS的关系? ActiveMQ是流行的开源消息中间件,JMS是Java平台定义的一种消息传递的标准。ActiveMQ实现了JMS规范,因此可以使用JMS API来与ActiveMQ进行交互。 JMS定义了一种标准的API。API包括了一些接口和类,用于创建…...

TouchGFX之缓存位图
位图缓存是专用RAM缓冲区,应用可将位图保存(或缓存)在其中。 如果缓存了位图,在绘制位图时,TouchGFX将自动使用RAM缓存作为像素来源。位图缓存在许多情况下十分有用。 从RAM读取数据通常比从闪存读取要快(特…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...