剖析 Redis:应对雪崩、穿透和击穿的实战秘籍

前言

用户的数据通常存储在数据库中,而数据库的数据存放在磁盘上。
磁盘的读写速度在计算机硬件中可以说是最慢的。
如果用户的所有请求都直接访问数据库,当请求数量增多时,数据库很容易崩溃。因此,为了避免用户直接访问数据库,会使用 Redis 作为缓存层。
因为 Redis 是内存数据库,我们可以将数据库中的数据缓存在 Redis 里,相当于把数据缓存在内存中。内存的读写速度比硬盘快好几个数量级,这样能大大提高系统性能。

引入缓存层后,就会出现缓存异常的三个问题,即缓存雪崩、缓存击穿和缓存穿透。

缓存雪崩(Cache Avalanche)

雪崩是指在Redis缓存中,大量的key在同一时间过期(失效),导致大量请求直接打到后端数据库,数据库短时间内承受巨大压力,可能导致数据库崩溃,进而影响整个应用系统的性能甚至可用性。例如,在一个电商系统中,有很多热门商品的缓存设置了相同的过期时间,当这些缓存同时过期时,大量查询热门商品的请求就会涌向数据库。

image

应对措施

  • 设置随机过期时间:避免大量key同时过期。可以在设置过期时间时,给每个key的过期时间加上一个小的随机值,使key在一段时间内分散过期。比如原计划10分钟过期的key,设置为10分钟 + 随机数(0 - 2分钟)过期。
  • 构建多级缓存:在Redis缓存之前再设置一层缓存,如本地缓存(如Guava Cache等)。当Redis中的数据过期,本地缓存可以继续提供服务,减轻数据库压力。同时,本地缓存的过期时间可以设置得稍长一些。
  • 服务熔断与降级:当检测到数据库压力过大时,启用熔断机制,暂时停止对数据库的访问,直接返回默认值或者缓存中的旧数据。当数据库压力恢复正常后再重新允许访问。对于一些非核心功能,可以进行服务降级,优先保证核心业务的正常运行。

缓存击穿(Hotspot Invalid)

击穿是指一个热点key(非常频繁被访问的key)在缓存中突然失效,而此时大量的并发请求同时访问这个key,这些请求会直接穿透到数据库,造成数据库瞬间压力过大。例如,在一个热门商品秒杀活动中,该商品的缓存突然过期,大量用户同时请求这个商品的信息,就会导致击穿现象。

应对措施

  • 永不过期 + 后台更新:对于热点key,可以设置为永不过期,然后在后台异步地更新这个key对应的缓存值。这样可以避免热点key突然过期导致的击穿问题。
  • 互斥锁:当发现热点key失效时,使用互斥锁来控制只有一个请求去数据库查询数据并更新缓存,其他请求等待。可以使用Redis的SETNX(SET if Not eXists)命令来实现互斥锁。当一个请求查询发现缓存中热点key不存在时,尝试使用SETNX命令设置一个锁标识,如果设置成功(表示获取到锁),则去数据库查询数据并更新缓存,然后释放锁;如果设置失败(表示锁已被其他请求占用),则等待一段时间后再次尝试查询缓存。

缓存穿透(Cache Penetration)

穿透是指查询一个根本不存在的数据,由于缓存中没有,每次请求都会穿透到数据库。如果攻击者恶意利用这种情况,不断发起对不存在数据的查询,会给数据库带来很大的压力。例如,有人恶意构造大量不存在的用户ID去查询用户信息,这些请求会不断地绕过缓存直接访问数据库。

应对措施

  • 布隆过滤器:在缓存之前增加布隆过滤器。布隆过滤器可以快速判断一个数据是否可能存在于数据库中。如果布隆过滤器判断数据不存在,那么直接返回,不再查询缓存和数据库。虽然布隆过滤器存在一定的误判率(将存在判断为不存在),但可以大大减少不必要的数据库查询。
  • 缓存空对象:当查询数据库发现数据不存在时,在缓存中缓存一个空对象,并设置较短的过期时间。这样下次再查询相同的数据时,直接从缓存中获取空对象,而不必再查询数据库。但是要注意空对象可能会占用一定的缓存空间。

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

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

相关文章

Java垃圾回收简述

什么是Java的垃圾回收? 自动管理内存的机制,负责自动释放不再被程序引用的对象所占用的内存。 怎么触发垃圾回收? 内存不足时:JVM检测到堆内存不足时,无法为新的对象分配内存时,会自动触发垃圾回收。手动…

Pandas -----------------------基础知识(八)

Pandas内置Matplotlib 加载数据 import pandas as pdanscombe pd.read_csv(/root/pandas_code_ling/data/e_anscombe.csv) anscombe dataset_1 anscombe[anscombe[dataset]I] dataset_1dataset_1.describe() 提供数据 dataset_1 anscombe[anscombe[dataset]I] dataset_2 an…

【C语言】分支和循环(2)

🤔个人主页: 起名字真南 😙个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 关系操作符2 条件操作符3 逻辑操作符 :|| ,&& ,!3.1 逻辑取反运算符3.2 与运算符3.3 或运算符3.4 练习闰年判断3.5 短…

仪器校准机构不符合项应该怎么签发和整改?

签发不合格项是内审工作之中非常重要的一环,那么如何正确签发不合格项,下列几个方面可以供大家参考: 一、目的 为便于仪器校准机构正确理解不符合项整改要求,特制定本指南,以指导企业规范、有效、高效地处理不符合项。…

旅游管理智能化:SpringBoot框架的应用

第一章 绪论 1.1 研究现状 时代的发展,我们迎来了数字化信息时代,它正在渐渐的改变着人们的工作、学习以及娱乐方式。计算机网络,Internet扮演着越来越重要的角色,人们已经离不开网络了,大量的图片、文字、视频冲击着我…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz 简介适用场景Quartz核心概念Quartz 存储方式Quartz 版本类型引入相关依赖方式一:内存方式(MEMORY)存储实现定时任务1. 定义任务类2. 定义任务描述及创建任务触发器3. Quartz的…

强引用、软引用、弱引用、虚引用用法

强引用、软引用、弱引用、虚引用用法 强引用弱引用弱引用虚引用 强引用 强引用是指程序中在程序代码之中类似“Object obj new Object()”的引用关系,无论任何情况下,只要强引用关系还存在,垃圾回收器就不会回收掉被引用的对象。 强引用是我…

日期类(Date)的实现 (C++版)

​ 🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:C入门 目录 前言 一、Date的头文件,包含函数声明 二、 Date.cpp 2.1 int GetMonthDay(int year, int month) 2.2 bool Check() 2.3 Date& …

【吊打面试官系列-MySQL面试题】什么是基本表?什么是视图?

大家好,我是锋哥。今天分享关于【什么是基本表?什么是视图?】面试题,希望对大家有帮助; 什么是基本表?什么是视图? 基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。 视图…

【含开题报告+文档+PPT+源码】闲置二手市场小程序的设计与实现

开题报告 闲置二手市场平台的背景可以追溯到互联网的普及和电子商务的兴起。随着互联网技术的不断发展,人们的消费观念也在不断变化,越来越多的人开始关注二手商品的价值和优势。同时,大用户群体也在不断增加,他们对于经济实惠的…

利用顺序栈输出对应的二进制数,找迷宫出口详解(数据结构作业04)

目录 利用顺序栈输出对应的二进制数 代码: 运行结果: 找迷宫出口 代码: 图解: 运行结果: 利用顺序栈输出对应的二进制数 键盘输入一个十进制正整数89,用C语言设计一个算法,利用顺序栈…

MambaAD 实验部分讲解

4 实验 4.1 设置:数据集、指标和细节 数据集(6个) 1.MVTec-AD: 包含5种类型的纹理和10种类型的对象,总共5,354张高分辨率图像。 实验: 3,629张正常图像被指定为训练。 剩下的 1,725 张图像被保留用于测试…

网络基础擅长组建乐队

让我们荡起双桨 来说说网络吧 现有计算机要进行协作,网络的产生是必然的 局域网:计算机数量更多了, 通过交换机和路由器连接在一起 广域网:将远隔千里的计算机都连在一起 交换机路由器等设备就应运而生 计算机是人的工具,人要协…

美国游戏发展趋势

美国拥有一些最大、最具影响力的游戏开发工作室,是游戏行业的全球领导者。凭借丰富地创新历史,美国游戏开发不断发展,受到尖端技术、消费者偏好和市场动态的影响。已经出现了几个趋势,这些趋势定义了该国游戏发展的方向&#xff0…

node高版本报错: digital envelope routines::unsupported

node高版本报错: digital envelope routines::unsupported 解决方案: package.json中,启动命令前加上: set NODE_OPTIONS--openssl-legacy-provider &&

WPF 手撸插件 八 操作数据库一

1、本文将使用SqlSugar创建Sqlite数据库,进行入门的增删改查等操作。擦,咋写着写着凌乱起来了。 SqlSugar官方文档:简单示例,1分钟入门 - SqlSugar 5x - .NET果糖网 2、环境SqlSugar V5.0版本需要.Net Framework 4.6 &#xff0…

Qt源码-Qt多媒体音频框架

Qt 多媒体音频框架 一、概述二、音频设计1. ALSA 基础2. Qt 音频类1. 接口实现2. alsa 插件实现 一、概述 环境详细Qt版本Qt 5.15操作系统Deepin v23代码工具Visual Code源码https://github.com/qt/qtmultimedia/tree/5.15 这里记录一下在Linux下Qt 的 Qt Multimedia 模块的设…

Windows 11 version 24H2 LTSC 2024 中文版、英文版 (x64、ARM64) 下载 (updated Oct 2024)

Windows 11 version 24H2 & LTSC 2024 中文版、英文版 (x64、ARM64) 下载 (updated Oct 2024) Windows 11, version 24H2,企业版 arm64 x64 请访问原文链接:https://sysin.org/blog/windows-11/ 查看最新版。原创作品,转载请保留出处。…

20年408数据结构

第一题: 解析:这种题可以先画个草图分析一下,一下就看出来了。 这里的m(7,2)对应的是这图里的m(2,7),第一列存1个元素,第二列存2个元素,第三列存3个元素,第四列存4个元素,第五列存5个元素&#…

C嘎嘎入门篇:类和对象番外(时间类)

前文: 小编在前文讲述了类和对象的一部分内容,其中小编讲述过运算符重载这个概念以及一个时间类,当时小编讲的没有那么细致,下面小编将会讲述时间类来帮助各位读者朋友更好的去理解运算符重载,那么,代码时刻…