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

news/2024/11/29 4:44:35/

文章目录

    • 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.ppmy.cn/news/64877.html

相关文章

数据结构学习记录——堆的小习题(对由同样的n个整数构成的二叉搜索树(查找树)和最小堆,下面哪个说法是不正确的)

目录 习题一 习题二 习题三 答案区 解析区 习题一 习题二 习题三 习题一 一、下列序列中哪个是最小堆? .2,55,52,72,28,98,71 .2,28,71,72&#x…

ASP.NET Core 8 中身份验证的改进

ASP.NET Core 团队正在改进 .NET 8 中的身份验证、授权和身份管理(统称为“身份验证”)。新的 APIs 将使自定义用户登录和身份管理体验变得更加容易。新的端点将在没有外部依赖的单页应用程序(SPA)中启用基于令牌的身份验证和授权。我们还将改进我们的指引和文档,使…

C++实现二分查找(力扣题目704)

题目要求:给定一个n个元素的(升序)整型数组nums和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1 示例 输入: nums [-1,0,3,5,9,12] target 9 输出: 4 解释: 9 出现在…

读书笔记:《图解CIO工作指南》

《图解CIO工作指南》第 4 版,日 . 野村综合研究所系统咨询事业本部 著,周自恒 译 大数据、云计算时代下的IT战略和IT实务 CIO工作:IT管理、IT架构、IT实践 以着眼企业未来的观点进行构思:可视化(业务与系统&am…

研究Linux内核的乐趣

对Linux的内核学习和研究的越多,越觉得其乐无穷。因为Linux内核的代码是由这二三十年来,世界上顶尖聪明的一群人编写的,为提高效率而做的各种设计和算法,充满着智慧的光芒。有时,在理解这些设计和算法的过程中&#xf…

前端常用的一些编辑器库

在 Vue3 TypeScript 中可以使用一些第三方库来实现代码文本编辑器,以下是一些常用的库: CodeMirror:一个灵活、易于集成的代码编辑器,支持多种语言和主题。 Monaco Editor:由微软开发的高性能代码编辑器,支…

消息队列的实现

【前言】 游戏的主逻辑一般是单线程的,所以实现一个消息队列很简单,不像互联网开发中会涉及多线程、多进程。可以先看看这篇文章。 对回调函数和消息机制的理解_消息回调函数_永恒星的博客-CSDN博客 这里尝试先去分析一些要素,然后直接基于…

如何从小白成长为一名运维专家

运维是系统管理和维护的一部分,要从小白成长为一名运维专家,需要不断学习、实践和积累经验。以下是一些建议,可以帮助您从小白成长为运维专家。 1、学习基础知识:掌握计算机基础知识,如操作系统(如Linux、Windows等)和…