redis缓存雪崩、穿透和击穿

c92f16877997476e852de46947ad5d87.gif缓存雪崩

 

  对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机或者大量缓存集中在某一个时间段失效。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。

 

 缓存雪崩的事前事中事后的解决方案如下:(针对宕机来看)

事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。

 

事中:本地 ehcache 缓存 + sentinel限流&降级,避免 MySQL 被打死。

 

事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

 

  用户发送一个请求,系统 A 收到请求后,先查本地 ehcache 缓存,如果没查到再查 redis。如果 ehcache 和 redis 都没有,再查数据库,将数据库中的结果,写入 ehcache 和 redis 中。

 

  限流组件,可以设置每秒的请求,有多少能通过组件,剩余的未通过的请求,怎么办?走降级!可以返回一些默认的值,或者友情提示,或者空白的值。

 

 好处:

数据库绝对不会死,限流组件确保了每秒只有多少个请求能通过。

 

只要数据库不死,就是说,对用户来说,2/5 的请求都是可以被处理的。

 

只要有 2/5 的请求可以被处理,就意味着你的系统没死,对用户来说,可能就是点击几次刷不出来页面,但是多点几次,就可以刷出来一次。

 

 针对大量 key 同时失效来看:

 

  就是将缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

 

  

 

缓存穿透

  对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。

 

  黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。

 

  举个栗子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

 

  暴力解法:

 

  解决方式很简单,每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。

 

  常见解法:

 

  1、在接口层增加校验,比如用户鉴权,参数做校验,不合法的校验直接 return,比如 id 做基础校验,id<=0 直接拦截

 

  2、采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力  

 

缓存击穿

  缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。

 

不同场景下的解决方式可如下:

 

若缓存的数据是基本不会发生更新的,则可尝试将该热点数据设置为永不过期。

 

若缓存的数据更新不频繁,且缓存刷新的整个流程耗时较少的情况下,则可以采用基于 redis、zookeeper 等分布式中间件的分布式互斥锁,或者本地互斥锁以保证仅少量的请求能请求数据库并重新构建缓存,其余线程则在锁释放后能访问到新缓存。

 

若缓存的数据更新频繁或者缓存刷新的流程耗时较长的情况下,可以利用定时线程在缓存过期前主动的重新构建缓存或者延后缓存的过期时间,以保证所有的请求能一直访问到对应的缓存。 

 

缓存并发竞争

  解释:多个客户端写一个 key,如果顺序错了,数据就不对了。但是顺序我们无法控制。

 

  解决方案:使用分布式锁,例如 zk,同时加入数据的时间戳。同一时刻,只有抢到锁的客户端才能写入,同时,写入时,比较当前数据的时间戳和缓存中数据的时间戳。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue心理测试管理系统

摘要 基于Spring Boot 和 Vue 的心理测试管理系统是一个综合利用现代Web开发技术的应用程序。系统采用了Spring Boot作为后端框架&#xff0c;通过其简化的配置和强大的功能提供了稳健的服务器端支持。前端则使用Vue.js&#xff0c;一个灵活、高效的JavaScript框架&#xff0c;…

版本控制系统教程

1.Git的基本介绍 1.1 Git的概念 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目.Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件.Git与常用的版本控制工具CVS&#xff0c;Subversion等不同&#xff…

Windows下安装部署Redis

一、下载 地址&#xff1a;https://github.com/MSOpenTech/redis/releases Redis-x64-3.2.100.msi版的比较简单&#xff0c;下载之后直接下一步&#xff0c;下一步… 即可完成安装部署。 这里主要演示Redis-x64-3.2.100.zip的安装部署过程&#xff0c;将Redis-x64-3.2.100.z…

多语言生成式语言模型用于零样本跨语言事件论证提取(ACL2023)

1、写作动机&#xff1a; 经过预训练的生成式语言模型更好地捕捉实体之间的结构和依赖关系&#xff0c;因为模板提供了额外的声明性信息。先前工作中模板的设计是依赖于语言的&#xff0c;这使得很难将其扩展到零样本跨语言转移设置。 2、主要贡献&#xff1a; 作者提出了一…

Redis的设计、实现

数据结构和内部编码 type命令实际返回的就是当前键的数据结构类型,它们分别是:string(字符串)hash(哈希)、list(列表)、set(集合)、zset (有序集合),但这些只是Redis对外的数据结构。 实际上每种数据结构都有自己底层的内部编码实现,而且是多种实现,这样Redis会在合适的…

linux创建文件并分配权限

linux中对文件的定义 在Linux中&#xff0c;文件是一个具有符号名字的一组相关联元素的有序序列。文件可以包含的内容十分广泛&#xff0c;操作系统和用户都可以将具有一定独立功能的一个程序模块、一组数据或一组文字命名为一个文件。文件名是数据有序序列集合&#xff08;文…

php 的数学常用函数

目录 1.常用列表 2.代码示例 1.常用列表 函数名描述输入输出abs()求绝对值数字绝对值数字ceil()进一法取整浮点数进一取整floor()舍去法求整浮点数直接舍去小数部分fmod()浮点数取余 两个浮点 数,x>y 浮点余数 pow()返回数的n次方基础数n次方乘方值round()浮点数四舍五入…

镜像迁移脚本

在日常的服务部署开发中&#xff0c;我们有时需要迁移环境&#xff0c;将服务器上的私有镜像从一个服务器迁移到另一个服务器中。在以微服务为架构的项目中&#xff0c;我们的一个项目可能存在大量的镜像&#xff0c;对每一个镜像单独进行导出打包迁移即重复又麻烦&#xff0c;…

vivado编译设置、执行设置、bit流生成设置

合成设置 使用“合成设置”可以指定约束集、合成策略、合成选项&#xff0c;以及要生成的报告。选项由选定的定义综合策略或综合报告策略&#xff0c;但您可以用自己的策略覆盖这些策略设置。您可以选择一个选项来查看对话框底部的描述。了解更多有关“合成设置”的信息&#…

【设计模式-03】Strategy策略模式及应用场景

一、简要描述 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

品牌出海新篇章:DTC营销与红人矩阵的完美结合

随着全球市场的竞争日益激烈&#xff0c;品牌在出海过程中面临着前所未有的挑战。传统的销售渠道逐渐显得滞后&#xff0c;DTC模式正成为品牌开拓国际市场的新趋势。在这一趋势中&#xff0c;结合红人矩阵的DTC营销策略备受关注&#xff0c;为品牌打开了一扇通向全球市场的大门…

基于爬虫和Kettle的书籍信息采集与预处理

一&#xff1a;爬虫 1、爬取的目标 将读书网上的书籍的基本信息&#xff0c;比如&#xff1a;封面、书名、作者、出版社、价格、出版时间、内容简介、作者简介、书籍目录、ISBN和标签爬取出来&#xff0c;并将爬取的结果放入数据库中&#xff0c;方便存储。 2、网站结构 图1读…

利用网络威胁情报增强网络安全态势

在当今的网络威胁形势下&#xff0c;明智且主动的防御策略至关重要。网络威胁情报是组织的重要工具&#xff0c;可帮助他们预测和应对网络风险。网络威胁情报不仅提供原始数据&#xff0c;还提供&#xff1a; 深入了解网络攻击者的动机了解他们的潜在目标了解他们的战术 通过…

如何运用TRIZ理论解决电动汽车的续航里程问题?

电动汽车的普及在很大程度上受到续航里程的制约。面对这一问题&#xff0c;传统的解决方案往往只能治标不治本。然而&#xff0c;TRIZ理论为我们提供了一个全新的视角&#xff0c;帮助我们从根本上解决这一难题。 TRIZ&#xff0c;全称为“发明问题解决理论”&#xff0c;是由苏…

java SSM物资采购管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM物资采购管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

JDBC-数据库连接池(druid)

一、背景 在介绍JDBC基本概念中&#xff0c;似乎Java程序每次与数据库交互都要通过驱动创建一个新的连接对象&#xff08;Connection&#xff09;&#xff0c;再由连接对象创建一个可执行SQL的Statement对象&#xff08;或PreparedStatement对象&#xff09;&#xff0c;操作完…

一键搭建elk

一键启动elk 1. 生成环境的脚本 setup.sh #!/usr/bin/bash# logstash enviroment mkdir -p logstash touch logstash/logstash.conf # shellcheck disableSC1078 echo input {tcp {mode > "server"host > "0.0.0.0"port > 4560codec > jso…

HCIP OSPF实验

任务&#xff1a; 1.使用三种解决ospf不规则区域的方法 2.路由器5、6、7、8、15使用mgre 3.使用各种优化 4.全网可达 5.保证更新安全 6.使用地址为172.16.0.0/16合理划分 7.每个路由器都有环回 拓扑图&IP划分如下&#xff1a; 第一步&#xff0c;配置IP&环回地址…

【面试突击】网关系统面试实战

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

Netty 介绍、使用场景及案例

Netty 介绍、使用场景及案例 1、Netty 介绍 https://github.com/netty/netty Netty是一个高性能、异步事件驱动的网络应用程序框架&#xff0c;用于快速开发可扩展的网络服务器和客户端。它是一个开源项目&#xff0c;最初由JBoss公司开发&#xff0c;现在由社区维护。Netty的…