redis之穿透、击穿、雪崩

news2024/11/18 15:29:24

目录

缓存雪崩

  问题描述


缓存雪崩

  问题描述

   key 对应的数据存在,但在 redis 中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端数据库加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端数据库压垮。

        缓存雪崩与缓存击穿的区别在于这里针对很多 key 缓存,前者则是某一个 key 正常访问。

解决方案
构建多级缓存架构:nginx 缓存 + redis 缓存 + 其他缓存(ehcache 等)。
使用锁或队列:用加锁或者队列的方式来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上,该方法不适用高并发情况。
设置过期标志更新缓存:记录缓存数据是否过期(设置提前量),如果过期会触发通知另外的线程在后台去更新实际 key 的缓存。
将缓存失效时间分散开:比如可以在原有的失效时间基础上增加一个随机值,比如 1-5 分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

缓存穿透
 

问题描述

      key 对应的数据在数据源并不存在,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源(数据库),从而可能压垮数据源。比如用一个不存在的用户 id 获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

缓存穿透发生的条件:
应用服务器压力变大
redis 命中率降低
一直查询数据库,使得数据库压力太大而压垮
其实 redis 在这个过程中一直平稳运行,崩溃的是我们的数据库(如 MySQL)。

缓存穿透发生的原因:黑客或者其他非正常用户频繁进行很多非正常的 url 访问,使得 redis 查询不到数据库。

解决方案
对空值缓存:如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟。
设置可访问的名单(白名单):使用 bitmaps 类型定义一个可以访问的名单,名单 id 作为 bitmaps 的偏移量,每次访问和 bitmap 里面的 id 进行比较,如果访问 id 不在 bitmaps 里面,进行拦截,不允许访问。
采用布隆过滤器:布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量 (位图) 和一系列随机映射函数(哈希函数)。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
进行实时监控:当发现 Redis 的命中率开始急速降低,需要排查访问对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。
 

 

 

 

缓存击穿
 

  问题描述

   key 对应的数据存在,但在 redis 中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端数据库加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端数据库压垮。

缓存击穿的现象:
数据库访问压力瞬时增加,数据库崩溃
redis 里面没有出现大量 key 过期
redis 正常运行
缓存击穿发生的原因:redis 某个 key 过期了,大量访问使用这个 key(热门 key)。

解决方案
        key 可能会在某些时间点被超高并发地访问,是一种非常 “热点” 的数据。

预先设置热门数据:在 redis 高峰访问之前,把一些热门数据提前存入到 redis 里面,加大这些热门数据 key 的时长。
实时调整:现场监控哪些数据热门,实时调整 key 的过期时长。
使用锁:
就是在缓存失效的时候(判断拿出来的值为空),不是立即去 load db。
先使用缓存工具的某些带成功操作返回值的操作(比如 Redis 的 SETNX)去 set 一个 mutex key。
当操作返回成功时,再进行 load db 的操作,并回设缓存,最后删除 mutex key;
当操作返回失败,证明有线程在 load db,当前线程睡眠一段时间再重试整个 get 缓存的方法。
 

 

总结:
 

如何保证mysql和redis的数据一致性

 读取数据时,先从redis读取数据,如果redis中没有,再从mysql中读取数据,并将读取到的数据同步到redis缓存中。

更新数据时,先更新mysql数据库,再更新redis缓存

删除数据时,先删除redis缓存,再删除mysql数据库

对于一些关键数据,可以使用mysql的触发器来实现同步更新redis缓存、可可以使用定时任务,定时自动进行缓存预热,来定期同步mysql和redis的数据。

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

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

相关文章

GPTfinger赋能指纹识别技术,德施曼赢下这一局

生成式AI这场战局里,德施曼跑赢同行,成为行业里第一个引入GPT技术的智能锁厂商。 4月2日,德施曼智能锁在北京举办了新品发布会之前的“创新技术预沟通会”,向到场媒体揭晓了最新技术突破之一——GPTfinger。 「智哪儿」认为&…

关闭PyCharm中因双击Shift而跳出的搜索框

有时候老是多次按到shift而跳出一个搜索框,本来在编写代码,怎么突然就开始搜索了,非常的烦人。 其实这个搜索框叫做“随处搜索”。 关闭步骤 1、打开PyCharm的设置。 2、在设置-高级设置中勾选-禁用双击修改键快捷键即可。

4.3学习总结

[HNCTF 2022 WEEK2]Canyource(无参数) 通过这题又接触了一种无参数RCE的方法,前面学习的getallheaders只有在apache环境下才能使用,具有一定的局限性 这里是利用php函数来构造读取flag的方法 localeconv() – 函数返回一个包含本…

Ribbon有哪些负载均衡策略

负载均衡类都实现了IRule接口。 RandomRule:随机的选用一个实例 RoundRobinRule:轮询的使用实例 RetryRule:在轮询的基础上加了一个错误重试机制,在deadline时间内会不断的重试 WeightResponeTimeRule:根据权重去做…

Golang 开发实战day07 - Functions

Golang 教程07 - Functions 1. Functions 1.1 什么是函数? 在 Golang 中,函数就像是代码的超级组合体,可以将一段代码封装成一个独立的单元,以便重复使用。 1.2 函数声明 func funcName(parameter1 type1, parameter2 type2)…

必看!香港Web3活动周跑会指南

星移斗转,又是一年嘉年华。 去年4月,在《虚拟资产发展政策宣言》的影响下,四散的华人Web3生态再度汇集,由万向区块链实验室、HashKey Group、W3ME联合举办的Hong Kong Web3 Festival 2023率先奏响了以香港为鼓点的加密奏曲&#x…

Celery的任务流

Celery的任务流 在之前调用任务的时候只是使用delay()和apply_async()方法。但是有时我们并不想简单的执行单个异步任务,比如说需要将某个异步任务的结果作为另一个异步任务的参数或者需要将多个异步任务并行执行,返回一组返回值,为了实现此…

个人医疗开支预测项目

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 项目背景 随着医疗成本的持续上涨,个人医疗开支成为一个重要议题。理解影响医疗费用的多种因素对于医疗保险公司、政府机构以及个人…

计算机组成结构1

概念 计算机组成: 运算器、控制器、存储器、输出设备、输入设备 CPU:运算器控制器 运算器:算数逻辑单元ALU、累加寄存器AC、数据缓冲寄存器DR、状态条件寄存器PSW 控制器:指令寄存器IR、程序计数器PC、地址寄存器AR、指令译码器I…

制作ubuntu镜像及烧录

最近更换了nuc主机作为机器人的控制主机,为了避免之前在操作系统过程中把系统搞崩了的惨状决定养成定期备份系统的好习惯,这就需要掌握制作系统镜像及烧录的能力。 1、安装systemback软件 ubuntu中可以使用systemback工具进行系统的备份,这…

人工智能、深度伪造和数字身份:企业网络安全的新前沿

深度伪造(Deepfakes)的出现打响了网络安全军备竞赛的发令枪。对其影响的偏执已经波及到一系列领域,包括政治错误信息、假新闻和社交媒体操纵。 深度伪造将加剧公共领域对信任和沟通的本已严峻的压力。这将理所当然地引起监管机构和政策制定者…

鸿蒙南向开发实战:【智能窗帘】

样例简介 智能窗帘设备不仅接收数字管家应用下发的指令来控制窗帘开启的时间,而且还可以加入到数字管家的日程管理中。通过日程可以设定窗帘开关的时间段,使其在特定的时间段内,窗帘自动打开或者关闭;通过日程管家还可以实现窗帘…

Intel TBB安装​​​​

下载 windows 版本,如: oneapi-tbb-2021.11.0-win.zip Releases oneapi-src/oneTBB (github.com)https://github.com/oneapi-src/oneTBB/releases 下载后解压,执行 env 文件夹下的 vars.bat 即可 Intel TBB,全称Intel Threading Building…

idea建多级目录出现问题,报错找不到xml文件,如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Python3.10 - 列表的常用方法

01 列表的切片 lst [a, b, 1, 2, [c1, 1]]# 01 列表的切片 lst1 lst[0:2] # 从0开始切到1(顾头不顾尾), 切得长度超过1时, 切出来为list类型 print(lst1, type(lst1))lst2 lst[0] # 从中切某个元素时, 切出来的类型即元素本身, 以下同理 print(lst2, type(lst2))lst3 ls…

会声会影可以制作卡拉OK字幕吗 会声会影制作卡拉OK字幕教程 会声会影视频制作教程 会声会影模板免费下载 会声会影2023永久激活版

会声会影是一款功能强大、操作简便的视频剪辑软件,适合不同级别的用户使用,无论是初学者还是专业人员,都能够轻松地实现自己的创意和想法。这篇文章就一起来学习一下会声会影可以制作卡拉OK字幕吗,会声会影制作卡拉OK字幕教程。 …

stm32之基本定时器的使用

在上文我们使用到了HAL库的自带的延时函数,HAL_Delay();我们来看一下函数的原型 __weak void HAL_Delay(uint32_t Delay) {uint32_t tickstart HAL_GetTick();uint32_t wait Delay;/* Add a freq to guarantee minimum wait */…

数据结构算法题(力扣)——链表

以下题目建议大家先自己动手练习,再看题解代码。这里只提供一种做法,可能不是最优解。 1. 移除链表元素(OJ链接) 题目描述:给一个链表的头节点 head 和一个整数 val ,删除链表中所有满足值等于 val 的节点…

关于ansible的模块 ③

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 接《关于Ansible的模块①》和《关于Ansible的模块②》,继续学习ansible的user模块。 user模块可以增、删、改linux远…

Pycharm显示Low memory的解决办法

这种情况该怎么办呢? 按照网上的说法,首先按照下图,选择memory Indicator: 就可以在pycharm的右下角看到内存以及其分配情况(allocated表示被分配的,可以看到我的已经被分配完了,应该是这个意思&#xff0…