Redis —缓存常见异常

文章目录

    • 缓存雪崩
      • 解决办法
    • 缓存击穿
      • 解决办法
    • 缓存穿透
      • 缓存穿透的两种常见情况
      • 解决办法
      • 布隆过滤器工作原理

缓存雪崩

  • 大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。

解决办法

针对大量数据同时过期的解决方法

  1. 设置过期时间:避免将大量数据设置成同一个过期时间,给这些数据的过期时间加上一个随机数
  2. 互斥锁:如果发现访问的数据不在 Redis 里,就加个互斥锁,保证同一时间内只有一个请求来构建缓存(实现互斥锁的时候,最好设置超时时间,防止锁一直不被释放,其他的请求也一直拿不到锁)
  3. 双Key策略
  • 一个是主 key,会设置过期时间,一个是备 key,不会设置过期,它们只是 key 不一样,但是 value 值是一样的,相当于给缓存数据做了个副本。
  • 当业务线程访问不到「主 key 」的缓存数据时,就直接返回「备 key 」的缓存数据,然后在更新缓存的时候,同时更新「主 key 」和「备 key 」的数据。

针对Redis故障宕机解决办法

  1. 服务熔断或请求限流机制
    • 当Redis故障时,启动服务熔断机制,暂停业务应用对缓存服务的访问,直接返回错误,不用再继续访问数据库
    • 但是此时暂停业务访问数据库,为了减少业务影响,启用请求限流机制,只将少部分请求发送到数据库进行处理,再多的请求就在入口直接拒绝服务,等到 Redis 恢复正常并把缓存预热完后,再解除请求限流的机制。
  2. 构建 Redis 缓存高可靠集群
    • 主从节点的方式构建 Redis 缓存高可靠集群。
    • 如果 Redis 缓存的主节点故障宕机,从节点可以切换成为主节点,继续提供缓存服务,避免了由于 Redis 故障宕机而导致的缓存雪崩问题。

缓存击穿

  • 例如秒杀活动,某类商品为热点数据,当缓存的某个热点数据过期了,此时此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。

解决办法

  • 不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据准备要过期前,提前通知后台线程更新缓存以及重新设置过期时间;
  • 互斥锁方案,保证同一时间只有一个业务线程更新缓存,未能获取互斥锁的请求,要么等待锁释放后重新读取缓存,要么就返回空值或者默认值。

缓存穿透

  • 当发生缓存雪崩或击穿时,数据库中还是保存了应用要访问的数据,一旦缓存恢复相对应的数据,就可以减轻数据库的压力
  • 缓存穿透:当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据

缓存穿透的两种常见情况

  • 黑客恶意攻击,故意大量访问某些读取不存在数据的业务;
  • 业务操作,缓存中的数据和数据库中的数据被误删

解决办法

  1. 非法请求的限制
    • API 入口处我们要判断求请求参数是否合理,请求参数是否含有非法值、请求字段是否存在,如果判断出是恶意请求就直接返回错误,避免进一步访问缓存和数据库。
  2. 缓存空值或者默认值
    • 后续请求就可以从缓存中读取到空值或者默认值,返回给应用,而不会继续查询数据库。
  3. 使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断数据是否存在。
    • 写入数据库数据时,使用布隆过滤器做个标记,然后在用户请求到来时,业务线程确认缓存失效后,可以通过查询布隆过滤器快速判断数据是否存在,如果不存在,就不用通过查询数据库来判断数据是否存在。
    • 即使发生了缓存穿透,大量请求只会查询 Redis 和布隆过滤器,而不会查询数据库,保证了数据库能正常运行

布隆过滤器工作原理

  • 布隆过滤器由「初始值都为 0 的位图数组」和「 N 个哈希函数」两部分组成。
  • 工作过程
    • 第一步,使用 N 个哈希函数分别对数据做哈希计算,得到 N 个哈希值;
    • 第二步,将第一步得到的 N 个哈希值对位图数组的长度取模,得到每个哈希值在位图数组的对应位置。
    • 第三步,将每个哈希值在位图数组的对应位置的值设置为 1;
  • 当查询数据x是否在数据库时,通过布隆过滤器只要查到位图数组的值的相应位置的值是否全为1,只要有一个为 0,就认为数据 x 不在数据库中。

在这里插入图片描述

注意:

  • 布隆过滤器由于是基于哈希函数实现查找的,高效查找的同时存在哈希冲突的可能性
  • 查询布隆过滤器说数据存在,并不一定证明数据库中存在这个数据,但是查询到数据不存在,数据库中一定就不存在这个数据。

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

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

相关文章

父子组件传值问题

文章目录前言一、问题描述二、问题解决前言 在写毕业设计,涉及了一些前端Vue.js的组件传值知识并出现了相关问题,因此进行记录。 问题 Vue.js的使用不熟练,相关组件、props等掌握不清晰前端代码书写不规范 望指正! 一、问题描述 …

php企业公司员工考勤加班系统

1、系统管理员 负责员工的基本信息管理(包括姓名、工号、所在部门信息的添加、修改和删除)和员工的上下班时间的添加。 公司考勤记录方式为刷上下班卡,卡机自动记录员工上下班时间。我直接跳过这一步,系统管理员每天在员工下班后直…

面试被问到:测试计划和测试方案有什么区别?

面试的时候,很多小伙伴都被面试官问过这个问题 “测试计划和测试方案有什么区别”? 到底有什么区别呢?我们先好好了解下这两个文档。 一、测试计划 1、测试计划是什么? 测试计划是组织管理层面的文件,从组织管理的…

派盘为您的个人数据安家

现如今,我们的生活中有着各种各样的数据。在工作中会有各种文件、邮件;在生活中则有照片和视频等。数据的来源多,时间点不一致且混乱。 数据是否能安全、稳定、长久的存储以及便捷高效的使用对我们来说相当重要。你是否经常出差需要带上电脑或者移动硬盘,想存网盘又怕丢失或…

一篇文章,弄懂蓝牙协议怎么看,进军物联网!

做过物联网相关项目的小伙伴都知道,避免不了和蓝牙,串口通信打交道。所以了解怎么看蓝牙协议基本上可以说是进军物联网的一大助力。很多新人小伙伴刚进入这个行业都是一脸懵逼的,特别是接入的时候,对方直接给了一个文档&#xff0…

【WCH】基于Keil环境CH32F203 GPIO点灯实验

【WCH】基于Keil环境CH32F203 GPIO点灯实验📌相关篇《关于CH32F203程序下载方式说明》 ✨如果是首次入门使用,请先看上面的相关篇内容,了解其下载相关事宜后,再进来学习。 GPIO模式介绍 🌿在应用手册的第十章介绍GPIO…

1mm³大小,世界首个功率破KW的单芯片激光模组诞生

近年来随着技术不断发展,激光雷达的体积、成本也在不断降低,成为了一种受到各行业关注的关键技术。它的用途越发广泛,可用于自动驾驶汽车、大气观测使用的LiDAR传感器,还可以用于医疗保健(治疗和检查分析)、…

给boss直聘的搜索结果加上hr活跃状态,少看点半年活跃的岗位

背景:这段时间找工作,无奈大环境不好,所在城市大部分公司都投了。就是没几个回复的,要么送达,要么已读不回,要么拿了简历没见邀约。然后boss为了争取我们多浏览网站,把一些陈年老醋也拿上台面&a…

阿里巴巴春招的后端面经来啦~

操作系统 一个操作系统,我们在衡量它的内存占用的时候,它一般会有哪些内存的部分? 读者答:堆和栈 补充: 这个其实是问你对free命令的理解。 主机的内存做一些清理的动作。你知道这里面会涉及到对哪些内存区域进行操…

yolov5-v7.0实例分割快速体验

简介 🚀yolov5-v7.0版本正式发布,本次更新的v7.0则是全面的大版本升级,最主要的功能就是全面集成支持了实例分割,yolov5已经集成检测、分类、分割任务。 前面几篇文章已经介绍过关于Yolov5的一些方面 yolov5目标检测:https://bl…

CIE (PCI Express) 1x, 4x, 8x, 16x总线端子说明

1、概述 PCI Express作为一种高带宽、低引脚数、串行、互连技术。它是为了取代旧的PCI和AGBus标准而设计的。PCIe比旧标准有许多改进,包括更高的最大系统总线吞吐量、更低的I/O引脚数和更小的物理占地面积、更好的总线设备性能扩展、更详细的错误检测和报告机制&am…

4.7--计算机网络之TCP篇之socket编程--(复习+深入)---好好沉淀,加油呀

1.针对 TCP 应该如何 Socket 编程? 1.服务端和客户端初始化 socket,得到文件描述符; 2.服务端调用 bind,将 socket 绑定在指定的 IP 地址和端口; 3.服务端调用 listen,进行监听; 4.服务端调用 accept&#…

版本控制工具Git的常见命令与使用方法

目录概述基础命令提交代码把代码提交到暂存区把代码提交到版本库同一笔提交想追加修改回退代码对代码进行了修改,想回退工作区的修改执行了add操作,想回退到工作区执行了commit操作,想撤销修改执行了commit操作,想回退到暂存区挑代…

二、Java 并发编程(1)

本章概要 常见的 Java 线程创建方式 继承 Thread 类实现 Runnable 接口通过 ExecutorService 和 Callable 接口实现有返回值的线程基于线程池 Java 线程池的原理 线程复用线程池的核心组件和核心类Java 线程池的工作流程线程池的拒绝策略 相对于传统的单线程,多线…

Nuxt项目动态路由带参接参

我们创建一个Nuxt项目 然后 在pages目录下创建 engineering.vue文件 参考代码如下 <template><div><div>工程界面</div><nuxt-child></nuxt-child></div> </template><script> export default {name: EngineeringPage …

java微服务商城高并发秒杀项目--008.订单服务继承Sentinel以及sentinel安装dashboard

在shop-order-service增加Sentinel依赖&#xff1a;<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-a libaba-sentinel</artifactId> </dependency>安装dashboard组件windows系统直接在1.8.0.jar中cm…

SMPL Model转换为bvh格式 (SMPL to BVH ) Python

BVH BVH是BioVision等设备对人体运动进行捕获后产生文件格式的文件扩展名。 BVH文件 BVH文件包含角色的骨骼和肢体关节旋转数据。BVH 是一种通用的人体特征动画文件格式&#xff0c;广泛地被当今流行的各种动画制作软件支持。通常可从记录人类行为运动的运动捕获硬件获得。 B…

说说如何借助webpack来优化前端性能?

通过webpack优化前端的手段有&#xff1a; ① JS代码压缩 ② CSS代码压缩 ③ HTML文件代码压缩 ④ 文件大小压缩 ⑤ 图片压缩 ⑥ Tree Shaking ⑦ 代码分离 ⑧ 内联 chunk 1、JS代码压缩 terser是一个JavaScript的解释、绞肉机、压…

2023年第十四届蓝桥杯将至,来看看第十三届蓝桥杯javaB组题目如何

ฅ(๑˙o˙๑)ฅ 大家好, 欢迎大家光临我的博客&#xff1a;面向阿尼亚学习 算法学习笔记系列持续更新中~ 文章目录一、前言二、2022年蓝桥杯javaB组省赛真题目录A:星期计算[5分]思路⭐代码&#x1f31f;B 山(5分)思路⭐代码&#x1f31f;C 字符统计(10分)思路⭐代码&#x1f3…

【学习笔记】启示录 - 打造用户喜爱的产品(阅读摘录)

【学习笔记】启示录 - 打造用户喜爱的产品&#xff08;阅读摘录&#xff09; 图书信息 Marty Cagan 著 七印部落 译 人员&#xff1a; 负责定义和开发产品的团队成员的角色和职责 流程&#xff1a; 探索、开发富有创意的产品时&#xff0c;反复应用的步骤和成功的实践经验 产品…
最新文章