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

【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. 缓存

缓存在计算机系统中有着重要的作用,它可以显著提高系统的性能和响应速度

  1. 提升系统性能: 缓存将常用的数据或计算结果存储在高速的存储介质中,如内存,以便快速地响应请求。通过减少对慢速存储介质(如硬盘或数据库)的访问次数,可以降低响应延迟,提高系统的吞吐量和效率
  2. 减轻后端压力: 通过缓存,系统可以减少对后端资源的频繁访问,降低数据库或其他外部服务的负载。这样可以节省计算资源,提高系统的可扩展性和稳定性
  3. 改善用户体验: 缓存能够加速应用程序的响应速度,从而提供更好的用户体验。用户可以更快地获取所需的数据或结果,减少等待时间,提高用户满意度

就以我们的大脑为例

  1. 5的阶乘是120,一般不需要一直拆成5*4*3*2*1去算,而是直接答120,因为我们大脑吧5的阶乘是120保存到“缓存”了!

  2. 再比如,你是个数学白痴,四道选择题一道不会,但是你在测试之前看到了答案,答案是ABCD,你记住了,放在“缓存”里;测试的时候,你直接写答案,四道选择题满分;下次遇到同样的四道选择题,题目和选项一模一样,一些你还记得答案,但是一些忘记了,“忘记了”也就是“缓存的过期”

2. Redis作为缓存

由于Redis高性能,多种数据结构,持久化支持的特性,再加上天生支持分布式,作为分布式机的缓存,担得起这个责任~

下面是Redis作为缓存常见的一些知识点

2.1 缓存雪崩

缓存雪崩是指在短时间内,由大量缓存同时过期,导致大量的请求直接访问查询数据库而不是缓存,从而对数据库造成巨大的压力,严重的情况下可能会导致数据库宕机!

缓存的存在,减少了请求访问查询数据库的频率,提高效率,减低数据库压力,过期后,“没人兜底了”

正常情况下:

在这里插入图片描述

缓存雪崩:

在这里插入图片描述

解决:

  1. 加锁排队,缺点就是增加系统的响应时间,降低系统吞吐量,牺牲一点用户体验

  2. 随机化过期时间,极大避免了同时过期这个事件的发生,系统常用的方式;甚至可以不设置过期时间,但对硬件要求高

  3. 设计二级缓存,Redis这一层防线沦陷后,二级缓存挺身而出

    在这里插入图片描述

2.2 缓存穿透

缓存穿透指的是查询数据库和缓存都没有数据,因为数据库查询无数据,出于容错考虑,不会将结果保存到缓存中,因此每次请求都会去查询数据库,这种情况就叫做缓存穿透

  • 可以理解为每次都无视缓存,缓存一直没被存数据,缓存没有其作用

在这里插入图片描述

2.3 缓存击穿

缓存击穿指的是热点缓存,在某一时刻恰好失效了,然后此时刚好有大量的并发请求,此时这些请求将会给数据库造成巨大的压力

  • 就像被击穿了个洞,一个缺口,“流量大,水压高”形成一道强硬的“水刀”刺向数据库
  • 而缓存雪崩则是水坝直接塌了,涌了下来

相比于缓存穿透,穿的严重程度显然更高

在这里插入图片描述

解决方案:

  1. 加锁排队
  2. 设置永不过期,既然是热点缓存,它配永不过期!

2.4 缓存雪崩、缓存穿透、缓存击穿的区别

  1. 缓存穿透是因为一直没有缓存数据导致的问题

  2. 缓存击穿是因为某个热点缓存失效而导致的问题

  3. 缓存血本是因为同时又大量的缓存失效所带来的问题

2.5 缓存预热

是一个优化手段,就是应用程序启动或缓存失效之后,主动将热点数据加载到缓存中的策略

  • 这样,在实际请求到达应用程序时,热点数据已经存在于缓存中,从而减少了缓存未命中的情况,提高了应用程序的响应速度

2.6 如何保证缓存和MySQL双写一致

可以采用以下几种方法:

  1. 读取优先
    • 在读取数据时,优先从Redis缓存中读取,如果缓存中不存在,则从MySQL数据库读取,并将数据写入Redis缓存。这样可以确保读取到的数据都是最新的,避免缓存中的脏数据
  2. 更新同步
    • 在更新数据时,先更新MySQL数据库,然后再更新Redis缓存。这样可以避免数据库和缓存中的数据不一致
  3. 使用队列
    • 通过将更新操作写入队列中,然后异步地从队列中获取操作并依次执行更新操作,先更新MySQL数据库,然后再更新Redis缓存。这样可以保证更新操作的顺序一致性,并减少数据库和缓存的并发写入冲突
  4. 使用事务
    • 在支持事务的数据库中,可以使用数据库事务来同时更新MySQL和Redis。当更新MySQL数据库时,在同一个事务中也更新Redis缓存。如果更新Redis缓存失败,可以回滚数据库事务,确保数据的一致性。
  5. 定时刷新
    • 设置一个定时任务,在一定时间间隔内将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)解决运行乱码问题

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:无 &#x1f33c…...

零基础学前端(二)用简单案例去理解 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地址&#xff08…...

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为开发者解决这样的痛点&#xf…...

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读取数据通常比从闪存读取要快(特…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...