当前位置: 首页 > 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读取数据通常比从闪存读取要快(特…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...