缓存雪崩、缓存穿透【Redis】

news2024/11/23 19:00:23

目录

缓存雪崩

一、产生原因

二、解决方案

缓存穿透

一、产生原因

二、解决方案


缓存雪崩

Redis缓存雪崩是指在系统高并发情况下,Redis缓存中的大量数据集中失效,导致系统的连续错误请求,进而造成数据库的过载和系统的崩溃。以下是对Redis缓存雪崩的详细解释:

一、产生原因

  1. 缓存数据过期时间设置过于接近:当大量的缓存数据设置了相同的过期时间,或者过期时间非常接近时,这些缓存数据可能会在同一时刻失效,从而导致缓存雪崩。
  2. 缓存服务器故障或宕机:如果Redis缓存服务器出现故障或宕机,那么缓存层将无法正常提供服务,所有的请求都会直接到达存储层,从而引发缓存雪崩。
  3. 系统访问高峰期:在系统访问高峰期,大量的请求可能会同时涌入Redis缓存,如果此时缓存层无法有效处理这些请求,也可能导致缓存雪崩。

二、解决方案

  1. 设置合理的缓存失效时间:合理设置缓存的过期时间,让缓存的失效时间分布在一个时间轴上,避免大量的缓存在同一时间失效。可以在原有失效时间的基础上增加一个随机值,如1~5分钟的随机范围,使每个缓存过期时间的重复率降低。
  2. Redis数据的热备份:通过将缓存数据备份到其他Redis实例中,当某个Redis实例发生故障或宕机时,可以快速切换到备份实例,保证系统的正常运行。
  3. 限流和降级:通过限制系统的访问流量,防止系统瞬时的高并发访问。同时,可以通过降级策略,如提供默认数据或静态页面等,来减轻系统的负载压力,保证系统的稳定性。
  4. 缓存预热:在系统上线之前,可以提前将热点数据加载到缓存中,以降低对数据库的访问压力。通过缓存预热可以尽可能减少缓存失效带来的冷启动问题,减轻雪崩的影响。
  5. 使用分布式缓存:将缓存数据分散存储在多个Redis实例中,避免单个Redis实例的故障引发雪崩问题。通过使用一致性哈希算法等技术,将缓存数据均匀地分布到多个节点上,提高系统的容错性和稳定性。
  6. 高可用性设计:使用Redis哨兵模式或Redis集群部署方式,确保缓存层的高可用性。即使个别Redis节点或机房宕掉,整个缓存层仍然可以使用。
  7. 互斥锁控制:在高并发场景下,为了避免大量的请求同时到达存储层查询数据、重建缓存,可以使用互斥锁控制。当缓存未命中时,对key加锁,然后从存储层查询数据并写入缓存层,最后释放锁。若其他线程获取锁失败,则让线程休眠一段时间后重试。

缓存穿透

Redis缓存穿透是指用户请求的数据在缓存和数据库中都不存在,导致每次请求都会直接访问数据库,进而可能给数据库带来巨大压力的现象。以下是对Redis缓存穿透的详细解释:

一、产生原因

  1. 数据不存在:当客户端请求的数据在缓存中和数据库中都不存在时,这些请求会绕过缓存直接到达数据库,导致数据库压力增大。
  2. 恶意攻击:攻击者可能会故意请求系统中不存在的数据,利用缓存穿透来消耗数据库资源,进而达到攻击目的。

二、解决方案

  1. 缓存空值

    • 对于查询结果为空的操作,可以将空结果缓存起来(通常设置一个较短的过期时间)。
    • 这样,当相同的请求再次到来时,可以直接从缓存中获取空结果,避免访问数据库。
    • 但需要注意,如果短时间内存在大量恶意请求,这种策略可能会导致缓存系统占用大量内存。因此,可以结合风控系统对用户请求进行统计和封禁。
  2. 布隆过滤器

    • 布隆过滤器是一种数据结构,用于快速判断一个元素是否存在于一个集合中。
    • 它通过多个哈希函数将元素映射到位数组上的多个位置,如果所有位置的值都为1,则认为元素存在;如果存在任一位置的值为0,则认为元素不存在。
    • 使用布隆过滤器可以在查询数据库之前快速判断数据是否存在,从而避免不必要的数据库访问。
    • 但需要注意的是,布隆过滤器存在一定的误判率,即可能会将不存在的元素误判为存在。因此,在设置布隆过滤器时需要根据实际情况调整其参数以降低误判率。
  3. 使用锁机制

    • 当发现缓存不存在时,可以使用锁机制来避免多个相同的请求同时访问数据库。
    • 只有一个请求会获得锁并查询数据库,其他请求会等待锁释放后再访问缓存或数据库。
    • 这种策略可以确保在数据库查询期间不会有其他请求重复访问数据库,从而减轻数据库压力。
    • 但需要注意的是,如果锁持有时间过长或锁释放不及时,可能会导致其他请求长时间等待甚至死锁。因此,需要合理设置锁的持有时间和释放策略。
  4. 组合方案

    • 在实际应用中,可以结合多种策略来解决缓存穿透问题。
    • 例如,可以先使用布隆过滤器进行初步筛选,如果数据不存在则直接返回失败;如果数据可能存在但缓存中不存在,则使用锁机制确保只有一个请求访问数据库;最后,将查询结果(无论是否为空)都缓存起来以供后续请求使用。

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

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

相关文章

《Vue零基础入门教程》第三课:起步案例

往期内容 《Vue零基础入门教程》第一课:Vue简介 《Vue零基础入门教程》第二课:搭建开发环境 做为第一个案例, 主要给大家介绍vue的最基本使用. vue使用的3步曲(重点) 引入vue.js编写页面(视图)创建App实例并挂载 1) 引入vue.js 在html的头部, 通过…

【unity小技巧】一些unity3D灯光的使用与渲染及性能优化方案

文章目录 天空盒反射配置太阳耀斑眩光烘培光照烘培光照时弹出错误,记得勾选模型下面的选择阴影项目配置光源模型模型shader的问题 全局光照混合光照模式混合照明模式减性照明模式Shadowmask照明模式间接烘焙照明模式 环境光遮罩灯光探针反射探针技术关闭反射探针可以…

【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录

背景 Jetbrain IDE 支持生成 Test 类,其中选择JUnit5 和 JUnit,但是感觉这不是标准的单元测试,因为接口命名吧。 差异对比 两者生成的单测API名称同原API,没加test前缀的。使用差异主要表现在: setUp & …

Nuxt3:拉取项目模板失败问题解决方法

问题描述 使用官网提供的命令npx nuxilatest init <project-name> 创建Nuxt3项目时&#xff0c;遇到了拉取项目模板失败的问题&#xff0c;报错信息如下 先分析一下这行命令在做的事情&#xff0c;结合之前的经验来看&#xff0c;似乎是在尝试通过该网址返回的元数据信息…

在 Sui 区块链上创建、部署与测试自定义 move _coin合约的完整教程

系列文章目录&#x1f60a; Task1&#xff1a;hello_move&#x1f340; Task2&#xff1a;move_coin&#x1f340; Task3&#xff1a;move_nft&#x1f340; 目录 系列文章目录&#x1f60a;引言一、更新本地代码1、查看当前项目的远程仓库信息。2、将远程仓库的最新代码同步到…

三层交换机静态路由实验

1、前置知识 2、实验目的 3、实验器材&#xff1a; 3560-23PS交换机2台、主机4台、交叉线1根和直通网线4根。 4、实验规划及拓扑 实验要求&#xff1a; &#xff08;1&#xff09;在交换机A和交换机B上分别划分基于端口的VLAN&#xff1a; 交换机 VLAN 端口成员 交换机…

iOS构建版本以及Hbuilder打iOS的ipa包全流程

目录 Hbuilder打ipa包 打包之前进行应用配置 应用版本号设置 使用广告标识设置 iOS-云打包 下载并转移安装包 使用Transporter提交版本 应用简介 下载应用 账号登录 提交安装包到apple store connect 在apple开发者平台上确认 总结 本篇文章详细的介绍了使用Hbuil…

java学习-集合

为什么有集合&#xff1f; 自动扩容 数组&#xff1a;长度固定&#xff0c;可以存基本数据类型和引用数据类型 集合&#xff1a;长度可变&#xff0c;可以存引用数据类型&#xff0c;基本数据类型的话需要包装类 ArrayList public class studentTest {public static void m…

返回流类型接口的错误信息处理

返回流类型接口的错误信息处理 前言axios拦截器src/utils/request.ts对应接口 前言 返回流类型接口需要在响应成功回调里拦截&#xff0c;且该接口的status始终是200&#xff0c;尽管后端返回的code可能是非2xx&#xff0c;因此返回流类型的接口&#xff0c;其错误信息需要单独…

用宏实现简单的计算器

大家好&#xff0c;那么经过我们前面几期的学习&#xff0c;我们对宏有了一定的了解&#xff0c;那么我们今天就来试试实现一个简单的加减乘除运算。 我们的思路是使用三目操作符来分别进行加减和乘除的运算&#xff0c;然后用if判断来”进入相关的判断体进而来进行计算。当然…

WEB攻防-通用漏洞文件上传js验证mimeuser.ini语言特性

知识点&#xff1a; 1、文件上传-前端验证 2、文件上传-黑白名单 3、文件上传-user.ini妙用 4、文件上传-php语言特性 详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整型&#xff0c;二次渲染等 3、检…

《Vue零基础教程》(3)创建第一个应用案例

1 应用实例 参考官方文档 https://cn.vuejs.org/api/application.html#create-app 示例 const {createApp} Vue// 通过createApp创建一个应用实例 const app createApp({/* 选项 */ }) console.log(app) 分析打印结果, 可知 应用实例是一个对象没有_开头的是公开属性/方…

复合瓦片切片集集合数量与性能关系验证

作者&#xff1a;lzzzz Sci瓦片聚合性能分析 需要聚合的图层越多&#xff0c;性能越低&#xff0c;目前测试以每个瓦片仅包含一个矢量面数据为例&#xff1a; sci数量 服务拉起耗时 前端加载&#xff08;单瓦片&#xff09; 100 10s 500ms 1000 5min 3s 10000 1hour …

大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇开始了&#xff01; 目前开始更新 MyBatis&#xff0c;一起深入浅出&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff0…

摄影:相机控色

摄影&#xff1a;相机控色 白平衡&#xff08;White Balance&#xff09;白平衡的作用&#xff1a; 白平衡的使用环境色温下相机色温下总结 白平衡偏移与包围白平衡包围 影调 白平衡&#xff08;White Balance&#xff09; 人眼看到的白色&#xff1a;会自动适应环境光线。 相…

性能监控利器:Ubuntu 22.04 上的 Zabbix 安装与配置指南

简介 今天我们来聊聊如何在 Ubuntu 22.04 上安装和配置 Zabbix。我们会用到 PostgreSQL 作为数据库后端&#xff0c;Nginx 作为 Web 服务器&#xff0c;并用 Let’s Encrypt SSL 证书来保驾护航。 什么是 Zabbix&#xff1f; Zabbix 是一个开源的网络监控和管理解决方案&…

队列基本实现

模板 int queue[10010]; int hh1,tt0; void push1(int x) {queue[tt]x; } void pop1() {if(hh>tt){cout<<"ERR_CANNOT_POP"<<endl;}else{hh;} } int query1() {if(hh>tt){cout<<"ERR_CANNOT_QUERY"<<endl;}return queue[hh…

【ArcGISPro】使用AI模型提取要素-提取车辆(目标识别)

示例数据下载 栅格数据从网上随便找一个带有车辆的栅格数据 f094a6b1e205cd4d30a2e0f816f0c6af.jpg (1200799) (588ku.com) 添加数据

GitLab|数据迁移

注意&#xff1a;新服务器GitLab版本需和旧版本一致 在旧服务器执行命令进行数据备份 gitlab-rake gitlab:backup:create 备份数据存储在 /var/opt/gitlab/backups/ 将备份数据传输到新服务器的/var/opt/gitlab/backups/下&#xff0c;并修改文件权限&#xff08;下载前和上传…

UE5 5.1.1创建C++项目,显示error C4668和error C4067的解决方法

因为工作要求&#xff0c;没法使用最新 5.5版本的ue5 而是要用ue5.1和5.2版本。 但是我在安装下载了visual studio2022后&#xff0c;使用 ue5.1编辑器 创建C项目&#xff0c;爆出如下错误。 error C4668: ?????__has_feature?????ΪԤ?????꣬???0????…