Redis 缓存穿透、缓存击穿与缓存雪崩

news2024/10/6 0:31:11

文章目录

    • 1. 缓存穿透
      • 解决方法
    • 2. 缓存击穿
      • 解决方法
    • 3. 缓存雪崩
      • 解决方法

 在 redis 的应用场景中,需要考虑缓存在某些场景下可能出现的问题:

  • 缓存穿透

  • 缓存击穿

  • 缓存雪崩

 以下缓存问题的讨论都是基于以下应用架构讨论的:

1. 缓存穿透

 对应的数据在数据源中并不存在,每次针对此数据的请求从缓存获取不到,请求都会落到数据源,从而给数据源带来巨大的负载。即恶意请求穿透了缓存,落到了数据源,使得 redis 的数据缓存作用失效。

比如用一个不存在的用户 ID 获取用户信息,无论是缓存还是数据库都没有,黑客利用此漏洞进行攻击可能压垮数据库。

解决方法

  1. 缓存空结果。即使 redis 和数据源都不存在该资源,就将请求的数据作为空结果缓存一段时间,且为该数据设置一个较短的过期时间,否则数据的时效性会产生问题;

  2. 检验用户的合法性。对用户请求的合法性进行校验,对重复恶意的请求进行拦截(记录恶意用户或恶意 IP);

  3. 布隆过滤器。布隆过滤器的用途为帮助判断某个值是否存在。布隆过滤器的原理是使用一个 bitmap 数组用作标记,使用多个哈希函数对 key 值进行计算,并将计算值对应的位置在 bitmap 中进行置位,表示该 key 存在:

 布隆过滤器仍存在一定误判的可能性(每个函数计算值都与存在值哈希冲突),但仍可帮助拦截一部分不存在的数据。减少误判的方法:
  1. 增加 bitmap 的程度;

  2. 增加使用的哈希函数


2. 缓存击穿

 即针对某一 特定 数据发起大量并发请求,当该数据在 redis 中过期时,这些请求会导致应用同时发起从数据源加载数据的请求,这时集中的大量并发请求可能会瞬间给数据源带来巨大负载。

解决方法

  1. 设置热点数据永不过期。可以设置定期任务,定期更新热点数据的 expire time;

  2. 使用互斥锁。即使用互斥锁保证只有一个请求会从数据源加载数据,操作逻辑如下:在缓存失效(取出值判断为控股)时,先尝试获取分布式锁:

    • 若获取成功,则发起从数据源加载数据的请求;

    • 若获取失败,则休眠一段时间后,尝试重新获取数据
       此方法的缺点在于会对吞吐量造成影响。



3. 缓存雪崩

 即某个时刻 redis 中的热点数据都消失了(缓存服务器重启或大量数据集中在某个时间段失效),这时也会导致应用从数据源加载数据,给数据源带来很大压力。

解决方法

  1. 保持缓存的高可用性。使用 Redis 哨兵模式或建立 Redis 集群,即使个别节点下线,整个缓存层依然可用;

  2. 缓存永不过期。Redis 中保存的 key 永不失效,这一就能解决大量缓存同时失效的问题,但随之而来的就是 Redis 需要更多存储空间;

  3. 设置随机过期时间。为每个数据设置随机的失效时间,避免

  4. 使用互斥锁重建缓存。即使用互斥锁避免大量的请求到达数据源查询数据,该方法同样会影响高并发场景下的吞吐量。

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

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

相关文章

数据备份系列:Rsync 备份实战记录(二)

一、Rsync Cron 场景使用 在对数据备份要求实时性不高的情况下,可优先考虑该场景,选择一个合适的时间,对数据进行定时远程增量同步。 在《数据备份系列:Rsync 备份详解(一)》中我们已经对服务搭建以及远程…

DAD-DAS模型

DAD-DAS模型 文章目录 DAD-DAS模型[toc]1 产品服务:需求方程2 实际利率:费雪方程3 通货膨胀:菲利普斯方程4 预期通货膨胀:适应性预期5 货币政策规则:泰勒方程6 动态总供给-总需求方程(DAS-DAD)7 总供给冲击模拟 1 产品服务:需求方…

【JavaEE初阶】文件操作——IO

摄影分享~ 文章目录 文件文件路径(Path) 文件的类型Java中操作文件File概述 文件内容的读写——数据流字节流InputStream概述OutputStream 概述字符流FileInputStream 概述利用 Scanner 进行字符读取 实例练习 文件 文件:File这个概念&…

PostSQL内存管理之内存上下文

瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:14 文档用途 了解pg内存分配 详细信息 1.MemoryContex机制 内存上下文是pg相关的内存控制结构,树形结构组织下的内存上下文能在频繁的…

SNMPc软件的下载和安装教程,计算机网络管理,网络工程师

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…

vue 改变数据后,数据变化页面不刷新

文章目录 导文文章重点方法一:使用this.$forceUpdate()强制刷新方法二:Vue.set(object, key, value)方法三:this.$nextTick方法四:$set方法 导文 在vue项目中,会遇到修改完数据,但是视图却没有更新的情况 v…

让开发者成为创新主体 | 阿里云云原生4月动态

作者:云原生内容小组 云原生月度动态 ✦ 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。 本栏目每月更新。 01 趋势热点 &…

vue - 实现登录后用户无操作后自动退出登录功能,当用户鼠标不动、键盘不动、无窗口滚动时自动清除登录状态(可自定义删减条件,详细示例源码一键复制开箱即用)

需求 很多教程都是无效而且有bug。。很难用索性自己搞了最健壮的解决方案。 在vue项目中,实现自动检测用户没有【移动鼠标】【操作键盘】【窗口滚动】时,自动清除登录信息强制退出登录下线,支持自定义触发时间(比如无操作10分钟就执行),自定义条件(比如只监听用户鼠标是…

匿名对象以及临时空间

目录 大纲 1.何为匿名对象 2.产生匿名对象的四种情况: 1)给初始化对象时 2)以值的方式给函数传参; 3)类型转换; 4)函数返回时; 3.编译器优化 I.在同一行代码的优化 II.在函…

电脑关机很慢怎么办?这5个方法很有用!

案例:电脑关机很慢怎么办? 【我的电脑才买来不久,现在每次关机都很慢,有时甚至一直在转圈圈无法关机,怎么处理这种情况呢?】 如果使用电脑时间长了,我们可能会发现电脑的各项性能都会有所下降…

Vue3(5)插槽Slots

目录 一、插槽内容与出口 二、渲染作用域 三、默认内容 四、具名插槽 五、作用域插槽 六、具名作用域插槽 一、插槽内容与出口 在之前的博文中,我们已经了解到组件能够接收任意类型的JS值作为props,但组件要如何接收模板内容呢?在某些…

图片堆叠、多重聚焦的几种办法

当拍摄的物品较小,景深较深时,相机的焦点只能放在较近或者较远的一处,图片的整个画面就不能保证完全清晰,多重聚焦的原理其实就是拼合,在画幅的不同处拍摄聚焦图片,将各个聚焦的内容拼合在一起,…

杂记 2023.5.11

目录 come across(as).. 与异性对话经验和理论、策略 单词记忆 机器学习 come across(as).. 这个用法在口语里超级高频,表示「给人.印象,让人觉得..」,s后面可跟名词、形容词、 being形容词。 我们再来看几个例子: ◆He comes ac…

【Leetcode -455.分发饼干 -459.重复的字符串】

Leetcode Leetcode -455.分发饼干Leetcode - 459.重复的字符串 Leetcode -455.分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩…

多语言的APP外包开发流程

很多创业的人希望把APP做成多国家使用的模式,尤其是一些小游戏开发,很多小游戏玩法全世界都是一样的,这样开发一次就可以在全球推广。在开发这种类型软件的过程中需要注意哪些呢,今天和大家分享这方面的知识。北京木奇移动技术有限…

C语言入门篇——字符串,内存函数

目录 1、字符串函数 1.1求字符串长度 1.1.1strlen函数 1.2长度不受限制的字符串函数 1.2.1strcpy函数 1.2.2strcat函数 1.2.3strcmp函数 1.3长度受限制的字符串函数介绍 1.3.1strncpy函数 1.3.2strncat函数 1.3.3strncmp函数 1.4字符串查找 1.4.1strstr函数 1.4.…

JavaScript实现输入年龄来判断年龄阶段是青年/中年/老年人的代码

以下为实现输入年龄来判断年龄阶段是青年/中年/老年人的程序代码和运行截图 目录 前言 一、实现输入年龄来判断年龄阶段是青年/中年/老年人 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择,您可以在目录里进行快速查找…

open3d 裁剪点云

目录 1. crop_point_cloud 2. crop 3. crop_mesh 1. crop_point_cloud 关键函数 chair vol.crop_point_cloud(pcd) # vol: SelectionPolygonVolume import open3d as o3dif __name__ "__main__":# 1. read pcdprint("Load a ply point cloud, crop it…

哪些蓝牙耳机戴久不疼?长时间佩戴不疼的蓝牙耳机推荐

现在的真无线耳机已经成为了人们的标配之一了,各个厂家也紧随其后,生产出了多种无线耳机,不少人的选购蓝牙耳机一般都是对音质、佩戴和连接,但通常人们佩戴蓝牙耳机都是在半天左右,小编专门整理了一期舒适度高的耳机&a…

从 0~1 创建 Vue2 项目

前言 从0开始搭建Vue2项目;介绍项目目录结构;为了项目方便需要添加的配置。创建 Vue2 项目共有两种方式: 手动选择;选择默认模式。 给孩子点点关注吧!😭 一、环境准备 1.1 安装包管理工具 1.1.1 安装 …