阿里面试Redis最常问的三个问题:缓存穿透、缓存击穿、缓存雪崩(带答案)

news2024/11/18 23:47:01

一、缓存穿透

如上图,正常情况下,如果用户在redis缓存中没有查询到自己想要的数据,就会去mysql数据库中查询。如果mysql数据库中也没有,在没有任何措施下,用户一定会不断的去mysql数据库中查询,随着时间的推移,用户越来越多,越来越多的用户在redis缓存中没有查询到自己想要的数据,越来越多的用户就会去mysql数据库中查询,这就造成了缓存穿透。

解决方案:

1、使用布隆过滤器

“过滤器”这个名词做过项目的人应该很熟悉,而对于redis缓存穿透而言,使用“布隆过滤器”就是解决方案之一。

后台服务端可以在用户和redis数据库之间搭上一个“过滤器”,在用户访问redis之前,通过布隆过滤器,如果用户想访问的数据在redis数据库中没有的话,就使用布隆过滤器将用户的这次访问给过滤掉,这样的话用户就不会再去访问mysql数据库了,很好的解决了缓存穿透。

2、redis缓存空值(占空间,没意义,不建议)

当用户访问redis的时候,如果说用户访问的数据在redis中没有,那就根据用户访问的“key”给用户在redis中缓存一个空的“value”,这样的话用户就不用再去访问mysql数据库了。

这种方法也是解决缓存穿透的一种方案,但是不建议。因为在redis中缓存一个空的value,一方面占了redis数据库的空间(redis数据库的数据是存在内存中的,而内存又有限),另一方面给一个key缓存一个空的value也没有什么意义,而且还浪费数据库开销,所以这种方案不建议。

二、缓存击穿

当某一个“key”的热度非常高,肯定就会有很多的人根据这个“key”去redis中查询对应的“value”。

刚才也说过,因为redis数据是存在内存中的,内存又有限,所以redis会对于一些数据设置过期时间,一到时间,这些key就会过期消失。

所以如果当某个热度很高的“key”在redis中过期了,那么这些用户肯定会集体的去访问mysql数据库(就像一颗颗子弹,全部都打到了一个点上),因此就造成了缓存击穿。

缓存击穿和缓存穿透很像,但是还是有一些区别的。

解决方案:

1、设置热点数据永不过期

这是一个很绝的方案,可以完美的解决缓存击穿。

但是不建议,因为redis本就内存有限,热点数据越来越多,无疑就会撑满redis,导致redis的性能下降。总的来说就是“占空间”。

2、加互斥锁

某个热点“key”突然失效过期,用户们在redis中访问无果,肯定会集体去mysql访问。

而在用户们访问mysql之间就可以加一道锁,来解决缓存击穿。

加锁只保证一个线程可以进去,这样的话就可以解决大量的用户去mysql访问同一个数据。

三、缓存雪崩

缓存雪崩是最好理解的,雪崩的场景大家肯定都不陌生。

当某个时间段,redis缓存中的“key”集体失效(可以理解为redis宕机),那么用户查不到这些“key”对应的“value”,就肯定会集体的向mysql数据库中查询,这样大面积的访问,就造成了缓存雪崩。

和缓存击穿很像,但是又不一样,缓存击穿是大量的用户去mysql中查询同一个“key”对应的“value”,而缓存雪崩是大量的用户去mysql中查询不同“key”对应的“value”。

解决方案:

1、实现redis高可用

搭建redis集群,配置redis哨兵机制,实现redis高可用。

主机宕机之后,通过redis哨兵机制去自动的在从机中重新选取主机,实现redis的高可用,解决缓存雪崩。

2、数据预热

可以把可能会大量访问的数据预先访问一遍,然后在加载到缓存中,最后再给它们设置不同的缓存过期时间,让缓存失效的时间点尽量均匀一些。这也是解决缓存雪崩的一种方案。

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

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

相关文章

风控串行组合模型及其信用评估场景实践

在信贷风控中,数据建模好像是“家常便饭”那么普通且重要,而我们最终享用“饭菜”的美味程度,在数据“食材”较完备的情况下,完全取决于我们建模的方法。根据实际业务场景,采用合理且有效的建模思路,可以较…

诊断和响应故障_RMAN数据修复概念

1.RMAN数据修复概述 1.1.关于需要数据修复的问题 虽然有几种问题会中止Oracle数据库的正常操作或影响数据库I/O操作,只有以下几种情况要求DBA介入和数据修复:用户错误,应用程序错误和介质故障。 1.1.1.关…

[附源码]计算机毕业设计JAVA中达小区物业管理系统

[附源码]计算机毕业设计JAVA中达小区物业管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM my…

【LeetCode】1775. 通过最少操作次数使数组的和相等

题目描述 给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。 每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值(包含 1 和 6&…

LaTeX行距以及字体大小

LaTeX行距以及字体大小1、行距2、字体大小1、全局模式2、局部模式1、行距 一:改变全文行距 导言部分前加入\linespread{2.0}即可,代表全文两倍行距。 二:部分段落需要改变行距 \usepackage{setspace} \begin{spacing}{2.0}(内…

js_实现网页自动跳转

网页自动跳转实现网页定时自动跳转实现网页定时自动跳转 效果&#xff1a; 10秒后自动跳转到网易云音乐的页面 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.box{wi…

什么是 NFT 洗盘交易:洗盘交易背后的原理

2022年12月 CoinGecko 与 Footprint Analytics 联合报告 Data Source&#xff1a;Footprint Analytics 市场上有一种说法是&#xff0c;整个NFT 市场的交易本质是欺诈性的&#xff0c;并且是由洗盘交易者操纵出来的假象。我们经常看到许多 媒体头条 在推动这种说法。毕竟&…

HTML学生个人网站作业设计:宠物网站设计——萌宠有家(5页) HTML+CSS 简单DIV布局宠物介绍网页模板代码 DW学生个人网站制作成品下载

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

动态规划:01背包问题例题(leetcode+cpp实现)

文章目录分割等和子集最后一块石头的重量前情回顾&#xff1a; 动态规划(4)&#xff1a;01背包问题详解 分割等和子集 力扣传送门&#xff1a; https://leetcode.cn/problems/partition-equal-subset-sum/ 题目描述&#xff1a; 给你一个整数数组&#xff0c;将这个数组里的…

论文速读Backbone系列一:点云Transformer结合、PointNet++改进、点云卷积核设计

如有错误&#xff0c;恳请指出。 对一些经典论文进行快速思路整理&#xff0c;以下内容主要关注的是3d点云的backbone设计&#xff0c;包括transformer的应用&#xff0c;卷积核的设计&#xff0c;PointNet网络的改进。 文章目录一、Transformer改进1. 《PCT: Point Cloud Tran…

Wireshark高级特征

1&#xff0c;端点和网络会话 想要让网络通信正常进行&#xff0c;你必须至少拥有两台设备进行数据流的交互。端点&#xff08;endpoint&#xff09;就是指网络上能够发送或接收数据的一台设备。两个端点之间的通信被称之为会话&#xff08;conversation&#xff09;。Wiresha…

Python中如何选择Web开发框架?

Python开发中Web框架可谓是百花齐放,各式各样的web框架层出不穷,那么对于需要进行Python开发的我们来说,如何选择web框架也就变成了一门学问了。本篇文章主要是介绍目前一些比较有特点受欢迎的Web框架,我们可以根据各个Web框架的特性进行选择应用。 Django Django是市面上…

利用Astar算法实现飞行轨迹的三维路径规划(基于Matlab代码实现)

目录 1 概述 1.1研究背景 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 随着自动化技术的发展,现代航空技术水平有了前所未有的提高,促进了无人机在军事、民用领域的广泛应用。航迹规划技术作为无人机任务规划的关键技术,一直都是无人机领域的一大研究热点。无人机航迹规划是…

Synopsys Sentaurus TCAD系列教程之-- Svisual《一》看图工具

Svisual Svisual作为独立的模块&#xff0c;可以实现Inspect对于节点.plt曲线的查看&#xff0c;也可以实现TecplotSV的.tdr看图功能&#xff0c;还可以进行自动化操作。 当作看图工具使用 - 当作一维曲线看图工具&#xff08;.plt,Inspect) 1.1 打开&#xff1a;Sdevice模块…

[附源码]Python计算机毕业设计SSM基于自组网的空地一体化信息系统(程序+LW)

[附源码]Python计算机毕业设计SSM基于自组网的空地一体化信息系统&#xff08;程序LW) 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

F12抓包简单案例

F12抓包原理&#xff1a;在电脑访问互联网之前&#xff0c;进行包录制 1.谷歌开发者工具&#xff08;F12&#xff09; 元素&#xff08;Elements&#xff09;&#xff1a;页面元素查看分析&#xff0c;web自动化 控制台&#xff08;Console&#xff09;:查看日志 来源&#xf…

c语言---指针进阶(2)--玩转指针

今天内容不多&#xff0c;但都是精华。 1.数组参数和指针参数 2.函数指针 2.1笔试题 3.函数指针数组 1.数组参数和指针参数 例1&#xff1a;一维数组传参 void test(int arr[]) {} void test(int arr[10]) {} void test(int *arr) {}void test2(int *arr2[20]) {} void …

kotlin之声明变量的方式

让我们来看一下java声明变量的方式 Java声明变量方式 类型 变量名 等于 初始化值 String str "999999999"; kotlin声明变量方式 <关键字> <变量名称> : <类型> <初始化值> var sr : String "s…

[附源码]Python计算机毕业设计SSM计算机软考系统的设计与实现(程序+LW)

[附源码]Python计算机毕业设计SSM计算机软考系统的设计与实现&#xff08;程序LW) 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。…

nginx安装及使用(详细版)

一、负载均衡介绍 负载均衡分为硬件负载均衡和软件负载均衡。 硬件负载均衡解决方案是最直接服务器和外部网络间安装负载均衡设备&#xff0c;这种设备我们通常称之为负载均衡器产品有F5、NetScaler等。 软件负载均衡解决方案是指一台或多台服务器响应的操作系统上安装一个或多…