当前位置: 首页 > news >正文

Redis篇(缓存机制 - 基本介绍)(持续更新迭代)

目录

一、缓存介绍

二、经典三缓存问题

1. 缓存穿透

1.1. 简介

1.2. 解决方案

1.3. 总结

2. 缓存雪崩

2.1. 简介

2.2. 解决方案

2.3. 总结

3. 缓存击穿

3.1. 简介

3.2. 解决方案

3.3. 总结

4. 经典三缓存问题出现的根本原因

三、常见双缓存方案

1. 缓存预热

1.1. 简介

1.2. 作用和目的

2. 缓存清除

2.1. 什么是缓存清除?

2.2. 缓存清除的作用和目的

3. 代码示例

4. 知识小结


一、缓存介绍

缓存是一种数据存储技术,用于存储经常访问的数据,以便在需要时快速获取。通过缓存数据,可以减少

数据的访问时间和系统的负载,从而提高应用程序的性能。缓存可以应用在多个层次,例如CPU缓存、数

据库缓存和Web缓存。

二、经典三缓存问题

1. 缓存穿透

1.1. 简介

缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。

这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空

(相当于进行了两次无用的查询)

这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。

1.2. 解决方案

解决方案:

  • 对空值进行缓存
    类似于上面的例子,虽然数据库中没有id=-9527的用户的数据,但是在redis中对他进行缓存(key=-9527,value=null),这样当请求到达redis的时候就会直接返回一个null的值给客户端,避免了大量无法访问的数据直接打在DB上。
  • 实时监控
    对redis进行实时监控,当发现redis中的命中率下降的时候进行原因的排查,配合运维人员对访问对象和访问数据进行分析查询,从而进行黑名单的设置限制服务。
  • 使用布隆过滤器
    使用BitMap作为布隆过滤器,将目前所有可以访问到的资源通过简单的映射关系放入到布隆过滤器中(哈希计算),当一个请求来临的时候先进行布隆过滤器的判断,如果有那么才进行放行,否则就直接拦截。
  • 接口校验
    类似于用户权限的拦截,对于id=-3872这些无效访问就直接拦截,不允许这些请求到达Redis、DB上。

1.3. 总结

举例:客户端发送大量的不可响应的请求(如下图)

根本原因(结合上文)就是:请求根本不存在的资源

当大量的客户端发出类似于:https://localhost: 9090/user/18933?id=-9527的请求,就可能导致出现

缓存穿透的情况。

因为数据库DB中本身就没有id=-9527的用户的数据,所以Redis也没有对应的数据,那么这些请求在redis

就得不到响应,就会直接打在DB上,导致DB压力过大而卡死情景在线或宕机

2. 缓存雪崩

2.1. 简介

我们可以简单的理解为:由于原有缓存失效,新缓存未到时间(例如:我们设置缓存时采用了相同的过期时

间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库

CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。

2.2. 解决方案

解决方案:

  • 将失效时间分散开
    通过使用自动生成随机数使得key的过期时间是随机的,防止集体过期
  • 使用多级架构
    使用nginx缓存+redis缓存+其他缓存,不同层使用不同的缓存,可靠性更强
  • 设置缓存标记
    记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际的key
  • 使用锁或者队列的方式
    如果查不到就加上排它锁,其他请求只能进行等待

2.3. 总结

产生的原因:redis中大量的key集体过期

比如:当redis中的大量key集体过期,可以理解为redis中的大部分数据都被清空了(失效了),那么这时

候如果有大量并发的请求来到,那么redis就无法进行有效的响应(命中率急剧下降),请求就都打到DB上

了,到时DB直接崩溃。

3. 缓存击穿

3.1. 简介

某个 key 非常非常热,访问非常的频繁,高并发访问的情况下,当这个 key在失效(可能expire过期了,

也可能LRU淘汰了)的瞬间,大量的请求进来,这时候就击穿了缓存,直接请求到了数据库,一下子来这

么多,数据库肯定受不了,这就叫缓存击穿。某个key突然失效,然后这时候高并发来访问这个key,结果

缓存里没有,都跑到db了。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都

过期了,很多数据都查不到从而查数据库。

3.2. 解决方案

解决方案:

  • 提前对热点数据进行设置
    类似于新闻、某博等软件都需要对热点数据进行预先设置在redis中
  • 监控数据,适时调整
    监控哪些数据是热门数据,实时的调整key的过期时长
  • 使用锁机制
    只有一个请求可以获取到互斥锁,然后到DB中将数据查询并返回到Redis,之后所有请求就可以从Redis中得到响应

3.3. 总结

产生的原因:redis中的某个热点key过期,但是此时有大量的用户访问该过期key。

比如:类似于“某明星出轨事件”上了热搜,这时候大量的“粉丝”都在访问该热点事件,但是可能由于某种原

因,redis的这个热点key过期了,那么这时候大量高并发对于该key的请求就得不到redis的响应,那么就会将请求

直接打在DB服务器上,导致整个DB瘫痪。

4. 经典三缓存问题出现的根本原因

三者出现的根本原因是:Redis缓存命中率下降,请求直接打到DB上了

正常情况下,大量的资源请求都会被redis响应,在redis得不到响应的小部分请求才会去请求DB,这样DB

的压力是非常小的,是可以正常工作的

如果大量的请求在redis上得不到响应,那么就会导致这些请求会直接去访问DB,导致DB的压力瞬间变大

而卡死或者宕机。

大量的高并发的请求打在redis上

这些请求发现redis上并没有需要请求的资源,redis命中率降低

因此这些大量的高并发请求转向DB(数据库服务器)请求对应的资源

DB压力瞬间增大,直接将DB打垮,进而引发一系列“灾害”

三、常见双缓存方案

1. 缓存预热

1.1. 简介

缓存预热是一种在应用程序启动或缓存失效之后,主动将热点数据加载到缓存中的策略。

这样,在实际请求到达应用程序时,热点数据已经存在于缓存中,从而减少了缓存未命中的情况,提高了

应用程序的响应速度。

1.2. 作用和目的

缓存预热的主要作用和目的如下:

  1. 提高缓存命中率:通过预先加载热点数据,缓存预热可以提高缓存的命中率,从而减少对后端数据源(如数据库)的访问,降低系统的负载。
  2. 保持应用程序性能稳定:在应用程序启动或缓存失效之后,缓存预热可以防止请求对后端数据源产生突然的压力,从而保持应用程序的性能稳定。
  3. 优化用户体验:由于热点数据已经存在于缓存中,用户在请求这些数据时能获得更快的响应速度,从而提高用户体验。

2. 缓存清除

2.1. 什么是缓存清除?

缓存清除是一种策略,用于在数据发生变化时删除或更新缓存中的相关数据,以确保缓存中的数据与数据

源保持一致。缓存清除可以是手动触发的,也可以是自动触发的,例如设置缓存的过期时间。

2.2. 缓存清除的作用和目的

缓存清除的主要作用和目的如下:

  1. 保持数据一致性:当数据发生变化时,缓存清除可以确保缓存中的数据与数据源保持一致,从而避免因缓存数据过期或错误而导致的应用程序错误。
  2. 释放缓存空间:缓存空间是有限的,缓存清除可以删除不再需要的数据,为新的数据访问腾出空间。
  3. 提高缓存利用率:通过删除过期或不常用的数据,缓存清除可以确保缓存中的数据是最有价值的,从而提高缓存的利用率。
  4. 避免脏数据:在某些情况下,缓存中的数据可能因为程序错误、系统故障等原因而变得不可靠。
    缓存清除可以定期或根据需要清理这些脏数据,确保缓存中的数据是有效的。

3. 代码示例

我们使用Spring Boot的spring-boot-starter-cache依赖来实现缓存。

首先,在pom.xml中添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

假设我们有一个表示商品的Product实体:

public class Product {private Long id;private String name;private BigDecimal price;// 构造函数、getter和setter方法
}

我们创建一个ProductService类来处理Product实体的查询和更新操作,

并使用@Cacheable和@CacheEvict注解来实现缓存预热和缓存清除。

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class ProductService {private final ProductRepository productRepository;public ProductService(ProductRepository productRepository) {this.productRepository = productRepository;}@Cacheable(value = "products", key = "#id")public Product getProduct(Long id) {// 模拟数据库查询return productRepository.findById(id);}@CacheEvict(value = "products", key = "#product.id")public void updateProduct(Product product) {// 模拟数据库更新productRepository.update(product);}// 缓存预热方法public void cacheWarmUp() {List<Product> products = productRepository.findAll();for (Product product : products) {getProduct(product.getId());}}
}

在这个示例中,我们使用@Cacheable注解来缓存getProduct方法的结果,当获取商品时,首先会在缓存

中查找,如果未找到,则查询数据库并将结果存储到缓存中。我们使用@CacheEvict注解来清除

updateProduct方法更新的商品的缓存。cacheWarmUp方法用于缓存预热,它主动加载所有商品到缓存

中。要在应用程序启动时执行缓存预热,我们可以实现CommandLineRunner接口并重写run方法:

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class CacheWarmUpRunner implements CommandLineRunner {private final ProductService productService;public CacheWarmUpRunner(ProductService productService) {this.productService = productService;}@Overridepublic void run(String... args) {productService.cacheWarmUp();}
}

现在,我们的应用程序在启动时将自动执行缓存预热,加载所有商品到缓存中。

同时,在更新商品时,相关缓存将被清除,以保持数据的一致性。

4. 知识小结

本节详细介绍了缓存预热和缓存清除的概念、原理、作用和目的。缓存预热是一种主动加载热点数据到缓

存的策略,旨在提高缓存命中率、保持应用程序性能稳定和优化用户体验。而缓存清除则是在数据发生变

化时删除或更新缓存中的相关数据,以保持数据一致性、释放缓存空间、提高缓存利用率和避免脏数据。

相关文章:

Redis篇(缓存机制 - 基本介绍)(持续更新迭代)

目录 一、缓存介绍 二、经典三缓存问题 1. 缓存穿透 1.1. 简介 1.2. 解决方案 1.3. 总结 2. 缓存雪崩 2.1. 简介 2.2. 解决方案 2.3. 总结 3. 缓存击穿 3.1. 简介 3.2. 解决方案 3.3. 总结 4. 经典三缓存问题出现的根本原因 三、常见双缓存方案 1. 缓存预热 1…...

引领5G驱动的全球数字营销革新:章鱼移动广告全球平台的崛起

引领5G驱动的全球数字营销革新&#xff1a;章鱼移动广告全球平台的崛起 作为章鱼移动广告平台的营销战略顾问&#xff0c;黄珍珍通过她在市场营销、品牌推广、技术整合等多方面的丰富经验&#xff0c;成功推动了这一平台在全球广告市场的崛起。她不仅为平台的国际化扩展奠定了基…...

思维链ChatGPT

建立客户端 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )示例1 response client.chat.completions.create(model"gpt-3.5-turbo",messages[{"role": "user","content": &quo…...

idea中的Java版本运行错误

1.java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid 这个错误通常是由于升级到Java 21后,Lombok等库无法正确访问内部的Java编译器API导致的。具体原因如下: Lombok在…...

用HTML5+CSS+JavaScript庆祝国庆

用HTML5CSSJavaScript庆祝国庆 中华人民共和国的国庆日是每年的10月1日。 1949年10月1日&#xff0c;中华人民共和国中央人民政府成立&#xff0c;在首都北京天安门广场举行了开国大典&#xff0c;中央人民政府主席毛泽东庄严宣告中华人民共和国成立&#xff0c;并亲手升起了…...

《OpenCV 计算机视觉》—— 视频背景建模

文章目录 一、背景建模的目的二、背景建模的方法三、背景建模的步骤四、注意事项五、代码实现 一、背景建模的目的 视频背景建模的主要目的是从视频序列中提取出静态背景&#xff0c;以便将动态的前景对象与静态的背景进行分离。这有助于进一步分析和处理视频内容&#xff0c;…...

【Mac】和【安卓手机】 通过有线方式实现投屏

Mac 和 安卓手机 实现投屏&#xff08;有线&#xff09; 1.下载HomeBrew /bin/bash -c "$(curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install/master/install.sh)"2.安装Scrcpy brew install scrcpy3.安装adb brew install android-platfor…...

GitHub flow工作流

github.com github.com使用自己版本的标记语法&#xff0c;它提供了一组额外的有用的 特性&#xff0c;其中许多特性使处理github.com上的内容更加容易。 用户名-提及 键入一个符号&#xff0c;后跟一个用户名&#xff0c;将通知此人前来查看评论。 这叫做“提及”&#x…...

【Qt笔记】QFrame控件详解

目录 引言 一、QFrame的基本特性 二、QFrame的常用方法 2.1 边框形状&#xff08;Frame Shape&#xff09; 2.2 阴影样式&#xff08;Frame Shadow&#xff09; 2.3 线条宽度&#xff08;Line Width&#xff09; 2.4 样式表(styleSheet) 三、QFrame的应用场景 四、应用…...

【二十八】【QT开发应用】模拟WPS Tab

WidgetBase 类旨在实现窗口的可调整大小功能&#xff0c;使用户能够手动改变窗口的尺寸。该类通过以下机制实现窗口缩放效果&#xff1a;当鼠标移动至窗口边缘时&#xff0c;鼠标指针样式会动态改变以指示可调整大小的方向。用户在边缘区域按下鼠标左键后&#xff0c;可以通过拖…...

PyQt入门指南四 事件处理机制详解

1. 事件处理概述 在PyQt中&#xff0c;事件处理是实现交互性的关键部分。事件可以是用户的操作&#xff08;如点击按钮、键盘输入&#xff09;&#xff0c;也可以是系统的通知&#xff08;如窗口最小化、定时器超时&#xff09;。PyQt使用信号&#xff08;Signals&#xff09;…...

【24最新亲试】ubuntu下载go最新版本

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了工具配置的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于Ubuntu 升级 golang 版本完美步骤进行的&#xff0c;每个知识点的修…...

InnoDB 事务模型

文章目录 InnoDB 事务模型事务ACID特性事务隔离级别 事务操作事务并发问题事务数据读写类型Consistent Nonlocking Reads 快照读Locking Reads 加锁读 MVCC 并发控制实现原理InnoDB 隐藏列Read ViewUndo log实现过程 MVCC与隔离级别MVCC和辅助索引 幻读可重复读MVCC会出现幻读的…...

STM32 Hal库SDIO在FATFS使用下的函数调用关系

STM32 Hal库SDIO在FATFS使用下的函数调用关系 本文并不将FATFS的相关接口操作&#xff0c;而是将HAL在使用FATFS通过SDIO外设管理SD卡时&#xff0c;内部函数的调用逻辑&#xff0c;有助于当我们使用CUBEMX生成FATFS读取SD卡的代码时无法运行时Debug。本文也会说明一些可能出现…...

网络基础知识笔记(五)接口管理

接口管理 1. 物理层的功能 物理层要解决的三个问题&#xff1a; 1-信号&#xff1a; 模拟信号&#xff0c;数字信号(一组有规律变化的电流脉冲) 2-传输介质&#xff1a; 同轴电缆&#xff0c;双绞线(电信号,电口)&#xff0c;光纤(光信号,光口)&#xff0c;(空气)电磁波(WiFi,…...

网站集群批量管理-密钥认证与Ansible模块

一、集群批量管理-密钥认证 1、概述 管理更加轻松&#xff1a;两个节点,通过密钥形式进行访问,不需要输入密码,仅支持单向. 服务要求(应用场景)&#xff1a; 一些服务在使用前要求我们做秘钥认证.手动写批量管理脚本. 名字: 密钥认证,免密码登录,双机互信. 2、原理 税钥对…...

TCP四次挥手过程详解

TCP四次挥手全过程 有几点需要澄清&#xff1a; 1.首先&#xff0c;tcp四次挥手只有主动和被动方之分&#xff0c;没有客户端和服务端的概念 2.其次&#xff0c;发送报文段是tcp协议栈的行为&#xff0c;用户态调用close会陷入到内核态 3.再者&#xff0c;图中的情况前提是双…...

在 MySQL 中处理和优化大型报告查询经验分享

在 MySQL 数据库的使用过程中&#xff0c;我们经常会遇到需要生成大型报告的情况&#xff0c;这些查询可能涉及大量的数据和复杂的计算&#xff0c;对数据库的性能提出了很高的要求。 一、问题背景 大型报告查询通常具有以下特点&#xff1a; 数据量大&#xff1a;涉及大量的…...

数字图像处理:空间域滤波

1.数字图像处理&#xff1a;空间域滤波 1.1 滤波器核&#xff08;相关核&#xff09;与卷积 图像上的邻域计算 线性空间滤波的原理 滤波器核&#xff08;相关核&#xff09;是如何得到的&#xff1f; 空间域的卷积 卷积&#xff1a;滤波器核与window中的对应值相乘后所有…...

【easypoi 一对多导入解决方案】

easypoi 一对多导入解决方案 1.需求2.复现问题2.1校验时获取不到一对多中多的完整数据2.2控制台报错 Cannot add merged region B5:B7 to sheet because it overlaps with an existing merged region (B3:B5). 3.如何解决第二个问题处理&#xff1a; Cannot add merged region …...

DDOS攻击会对网站服务器造成哪些影响?

DDOS攻击作为日常生活正比较常见的网络攻击类型&#xff0c;可以让多台计算机在同一时间内遭受到攻击&#xff0c;下面小编就带领大家一起来了解一下DDOS攻击会对网站服务器造成哪些影响吧&#xff01; 首先DDOS攻击在进行攻击的过程中&#xff0c;可以对源IP地址进行伪造&…...

linux基础指令的认识

在正式学习linux前&#xff0c;可以简单认识一下linux与win的区别 win&#xff1a;是图形界面&#xff0c;用户操作更简单&#xff1b;在刚开始win也是黑屏终端 指令操作&#xff0c;图形界面就是历史发展的结果。Linux&#xff1a;也存在图形界面比如desktop OS&#xff1b;但…...

html5 + css3(下)

目录 CSS基础基础认识体验cssCSS引入方式 基础选择器选择器-标签选择器-类选择器-id选择器-通配符 字体和文本样式1.1 字体大小1.2 字体粗细1.3 字体样式&#xff08;是否倾斜&#xff09;1.4 常见字体系列&#xff08;了解&#xff09;1.5 字体系列拓展-层叠性font复合属性文本…...

828华为云征文|部署个人文档管理系统 Docspell

828华为云征文&#xff5c;部署个人文档管理系统 Docspell 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 Docspell3.1 Docspell 介绍3.2 Docspell 部署3.3 Docspell 使用…...

【深度学习】—激活函数、ReLU 函数、 Sigmoid 函数、Tanh 函数

【深度学习】—激活函数、ReLU 函数、 Sigmoid 函数、Tanh 函数 4.1.2 激活函数ReLU 函数参数化 ReLU Sigmoid 函数背景绘制 sigmoid 函数Sigmoid 函数的导数 Tanh 函数Tanh 函数的导数总结 4.1.2 激活函数 激活函数&#xff08;activation function&#xff09;用于计算加权和…...

对于基础汇编的趣味认识

汇编语言 机器指令 机器语言是机器指令的集合 机器指令展开来讲就是一台机器可以正确执行的命令 电子计算机的机器指令是一列二进制数字 &#xff08;计算机将其转变为一列高低电平&#xff0c;使得计算机的电子器件受到驱动&#xff0c;进行运算 寄存器&#xff1a;微处理器…...

网络基础知识笔记(一)

什么是计算机网络 1.计算机网络发展的第一个阶段&#xff1a;(60年代) 标志性事件&#xff1a;ARPANET 关键技术&#xff1a;分组交换 计算机网络发展的第二个阶段&#xff1a;(70-80年代) 标志性事件&#xff1a;NSFNET 关键技术:TCP/IP 计算机网络发展的第三个阶段&#xff…...

fatal: urdf 中的 CRLF 将被 LF 替换

git add relaxed_ik_ros2 fatal: relaxed_ik_ros2/relaxed_ik_core/configs/urdfs/mobile_spot_arm.urdf 中的 CRLF 将被 LF 替换 这个错误信息表示 Git 在处理文件 mobile_spot_arm.urdf 时发现它使用了 CRLF&#xff08;回车换行符&#xff0c;常见于 Windows 系统&#xff0…...

构建electron项目

1. 使用electron-vite构建工具 官网链接 安装构建工具 pnpm i electron-vite -g创建electron-vite项目 pnpm create quick-start/electron安装所有依赖 pnpm i其他 pnpm -D add sass scss1. 启动项目 2. 配置 package.json "dev": "electron-vite dev --…...

Stable Diffusion绘画 | 插件-Deforum:动态视频生成(中篇)

本篇文章重点讲解参数最多的 关键帧 模块。 「动画模式」选择「3D」&#xff1a; 下方「运动」Tab 会有一系列参数&#xff1a; 以下4个参数&#xff0c;只有「动画模式」选择「2D」才会生效&#xff0c;可忽略&#xff1a; 运动 平移 X 让镜头左右移动&#xff1a; 大于0&a…...