Redis:缓存击穿、缓存穿透与缓存雪崩的区别、解决方案

news2024/11/26 10:43:42

0、前言

        近期学习redis相关原理,记录一下开发过程中Redis的一些常见问题及应对方法。

1、缓存穿透

一句话总结:先查redis发现没数据,再去数据库查发现还是没数据

这种情况下缓存永远不会生效,数据库将承担巨大压力。

        我们知道,redis的缓存作用,是在客户端发起查询请求时:
        (1)先找redis,如果redis内命中数据则直接返回。
        (2)如果未命中,则不得不去数据库中查询,把数据放到redis里,然后再返回数据给客户端。
        对于缓存穿透的情况,例如多次恶意查询数据库和redis里都没有的数据,将给数据库带来巨大压力。

常见解决方法:

         缓存空对象,就是发现数据库也没有这个数据的时候,缓存一个空值在redis里,那么下次这种访问就会从redis里返回null,而不会继续查询数据库了。

2. 缓存雪崩

一句话:大量的缓存key同时失效(比如同时过期了),或者redis服务宕机(redis寄了),导致大量请求直接给到数据库,压力过大寄了。

        缓存雪崩,指的是大面积的 key 同时过期,导致大量并发打到我们的数据库。不像击穿,只是因为 1 个 key 的过期。所以,对于雪崩来说,一般少量的 key 失效,所带来的数据库的并发压力是不会太大的。而大量 key 的同时失效,导致所有 key 的并发加起来,会影响到我们的数据库。

        那就算一个 key 失效,也会对数据库造成很大的影响,那么你把雪崩的所有 key 拆成一个一个 key 来看,也就是雪崩可以拆分成一个一个缓存击穿的集合。

        其实在真实场景中,雪崩才是一个更容易发生的一个问题,它不像击穿那么极端,一个 key 就成千上万的并发,直接把数据库打垮了;而是,可能就一个 key 几十几百的并发,然后大量的 key 一过期,然后就使得好多并发,同时叠加起来,累积到上千上万个,把数据库打崩了。

解决方案

        怕key同时失效,那就把缓存的TTL时间分散开, 比如在失效时间的基础上加上一个随机值。

        针对redis宕机情况,可以进行Redis集群的布置,或者添加多级缓存,增强系统的容错性。

3、缓存击穿

        概括:要查的key对应的数据是存在的(不像穿透,是不存在的数据),但redis里没有(比如过期了,这很常见),如果这个key的数据是热点数据,即可能会有大量并发请求

        这么多的并发请求都发现redis没有对应的数据,则都要去查数据库,这样一来将造成巨大压力。

         例如下图中,在线程1把数据写入缓存之前,其他多个并发线程都会去查数据库,这样将造成巨大的压力。

 解决方案

        有的人可能会觉得,热点key过期容易导致缓存击穿,那我们把它的存活时间设成永久不就好了?
        这样肯定是不可以的,毕竟redis空间有限,不可能缓存那么多数据,而且“热点数据”也是会随时间变化的,也不可能把所有数据当成热点数据来缓存。

方案1:互斥锁(开发常用)

        假设会有 1w 个并发来访问这个 key,那么它们就会先查询 redis,然后都发现,这个 key 不存在;然后,它们就会对应的,往 redis 用 setnx 设置一个 key,来表示这是一把锁;

        这里介绍一下redis的setnx,该方法的作用可以标识锁,什么意思呢?

        setnx的使用方法是这样的:
        setnx key value

        如果key没有value,设置值成果。如果key已经有对应value,设置失败。

        类似于我们的互斥。上锁就是赋值、释放锁就是删掉锁(del key即可)

        一般会设置有效期,防止死锁。


        该方法通过传入锁的id,返回一个布尔值,来模拟获取锁的过程。

        然后,只有一个线程,会设置成功,然后去读取数据库,写回 redis;其他的 9999 个线程,则 sleep 一小会,然后再去访问我们的 redis。
        有人看到这,首先会问,这个 sleep 要多久?
        这个是要根据压测,以及线上环境进行调整的,一般会给出一个合适的值,也就是大约从数据库取出数据的时间。

 

 

 方案2:逻辑过期

        这种情况,我们假设key不会过期,而是通过人为地设置”expire time“一个属性,来进行人为地判断数据是否过期(比如,热门商品,那就在活动期间把它变为不会过期地key,等活动过了以后在主动让他过期)。

        中心思路就是,线程1抢到锁以后,将查数据库、返回缓存,这项比较耗时的任务交给别的线程(线程2)去做,然后多个并发线程就可以先返回过期的数据,等更新好了再返回新的。

        这样避免了大量线程休眠等待的情况。

 

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

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

相关文章

前端食堂技术周刊第 84 期:第 96 届 TC39 会议、Deno 五周年、JavaScript 安全最佳实践、2023 Node.js 性能现状

By Midjournery 美味值:🌟🌟🌟🌟🌟 口味:葡萄冰萃美式 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 第 96 届 TC39 会议Deno 五周年JavaScript 安全最佳…

FreeRTOS:信号量

目录 一、信号量是什么二、二值信号量2.1二值信号量简介2.2创建二值信号量2.2.1函数 vSemaphoreCreateBinary()2.2.2函数xSemaphoreCreateBinary()2.2.3 函数 xSemephroeCreateBinaryStatic()2.2.4二值信号量创建过程分析 2.3释放信号量2.3.1函数 xSemaphoreGive ()2.3.2函数 x…

【MySQL学习6:多行输入函数——聚合函数及SQL书写和执行规则】

之前做的笔记都在有道云,之后会一点点将以前的笔记分享出来~ (配图在笔记中查看) MySQL学习6:多行输入函数——聚合函数及SQL书写和执行规则 SQL书写顺序:SQL99执行顺序:一、常见的聚合函数1. 常见的聚合函…

算法当中的时间、空间复杂度?

1.究竟什么是时间复杂度 时间复杂度是一个函数,它定性描述该算法的运行时间 时间复杂度就是用来方便开发者估算出程序运行的答题时间。 通常会估算算法的操作单元数量来代表程序消耗的时间,这里默认CPU的每个单元运行消耗的时间都是相同的。 假设算法的…

微服务架构之服务监控与追踪

与单体应用相比,在微服务架构下,一次用户调用会因为服务化拆分后,变成多个不同服务之间的相互调用,每个服务可能是由不同的团队开发,使用了不同的编程语言,还有可能部署在不同的机器上,分布在不…

【MySQL】MySQL间隙锁--幻读解决原理

文章目录 一、间隙锁概念二、测试间隙锁范围加锁三、测试等值间隙锁 一、间隙锁概念 当我们用范围条件而不是相等条件检索数据, 并请求共享或排他锁时,InnoDB 会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录…

八、视图集ModelViewSet(重点)

上一章: 七、Django DRF框架GenericAPIView--搜索&排序&分页&返回值_做测试的喵酱的博客-CSDN博客 下一章: 九、DRF生成API文档_做测试的喵酱的博客-CSDN博客 一、视图集ModelViewSet与ReadOnlyViesSet ModelViewSet视图集 与 ReadOnly…

第13届蓝桥杯Scratch国赛真题集锦

编程题 第 1 题 问答题 LED屏幕 题目说明 编程实现 LED屏幕 具体要求: 1).点击绿旗,在舞台中心区域出现由10 x 10方格组成的LED屏幕; 2).按下空格键,LED屏幕最外环方格全部点亮 (方格变为黄色) 3).LED屏幕每秒向内点亮一层,其它LED灯熄灭; 4).直到LED灯在最中心点亮2秒…

games101作业5

作业要求 • Renderer.cpp 中的 Render():这里你需要为每个像素生成一条对应的光 线,然后调用函数 castRay() 来得到颜色,最后将颜色存储在帧缓冲区的相 应像素中。 • Triangle.hpp 中的 rayTriangleIntersect(): v0, v1, v2 是三角形的三个…

字节跳动测开岗面试居然这么简单....

因为读者里有不少刚入门测试的同学,这两天抽空整理了一份字节测开实习的面试题答案,说实话这个题目真挺简单的,如果你面大厂碰到此类面试题,也算是运气很好啦。大家也可以先自测一下,看看自己能不能答上来。 如果觉得…

vscode 插件 remote-ssh的安装及使用

文章目录 vscode 插件 remote-ssh的安装及使用windows VSCode(clangdremote-ssh) linux(clangd server) 开发环境问题问题1 : getPlatformForHost was canceled问题2 : host 主机不能联互联网问题3 : 每次都要输入密码 vscode 插件 remote-ssh的安装及使用 需要用到的东西1. r…

安装nodejs环境搭建vue项目的框架

说明:想要搭建一个vue项目的框架,先要安装nodejs环境;我的电脑已经安装过,先卸载掉,重新装一遍(卸载nodejs参考:http://t.csdn.cn/jHmCU) 一、安装nodejs环境 第一步:下…

ssh无密码链接

ssh的基本语法为 ssh host 然后输入密码才可以 如果a想要免密登录b,则a需要将自己的公钥放在b上,原理如下图: 例如,以aricoder这个用户登录的情况下,在服务器01上生成密钥,命令为 ssh-keygen -t rsa然后连…

前端面试题汇总大全二(含答案超详细,Vue,TypeScript,React,Webpack 汇总篇)-- 持续更新

前端面试题汇总大全(含答案超详细,HTML,JS,CSS汇总篇)-- 持续更新 前端面试题汇总二 五、Vue 篇1. 谈谈你对MVVM开发模式的理解?2. v-if 和 v-show 有什么区别?3. r o u t e 和 route和 route和router区别4.vue自定义…

千万级oracle数据表定时同步到mysql表的方案

1:业务背景 第三方系统提供了一张oracle视图,该视图有六千多万条数据,后续每月会产生三百万条数据的数据。需要每天将数据定时同步到自己系统的mysql表中。 (注:我们系统与外界系统访问都要经过一个中间系统的跳转才…

看我0~1精通自动化测试实战,暴涨18K...

前言 开头,先说一下现主流的接口自动化测试框架配套,也是很多企业在使用的。 接口自动化测试:PythonrequestspytestyamlalluerJenkins; Python自动化测试:7天练完这60个实战项目,年薪过35w。 除开测试脚本…

基于秒杀-----分布式锁----lua脚本

基于商品显示秒杀-一人一单业务_xzm_的博客-CSDN博客改进 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁 分布式锁的五个基本要求:多进程可见,互斥,高可用,高性能,安全性 三种实现方式 redi…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 9 Recommendation Systems

来源:《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 9 Recommendation SystemsRecommendation systems use a number of different technologies. We can classify these systems into two broad groups. Content-based systems examine properties…

STL 函数对象,即仿函数

目录 1.函数对象 1.1函数对象的概念 1.2函数对象的使用 2.谓词 2.1谓词概念 2.2一元谓词 2.3二元谓词 3.内建函数对象 3.1内建函数对象的意义 3.2算术仿函数 3.3关系仿函数 3.4逻辑仿函数 1.函数对象 1.1函数对象的概念 1.2函数对象的使用 #include<iostream>…

文心一言 VS 讯飞星火 VS chatgpt (25)-- 算法导论4.2 7题

七、设计算法&#xff0c;仅使用三次实数乘法即可完成复数 abi和cdi 相乘。算法需接收a、b、c和d 为输入&#xff0c;分别生成实部 ac-bd 和虚部adbc。 文心一言&#xff1a; 可以使用如下算法来计算复数 abi 和 cdi 的积&#xff0c;且只需进行三次实数乘法&#xff1a; 1.…