Redis的缓存问题

devtools/2024/10/20 8:54:54/
缓存雪崩
  • 定义缓存雪崩是指在某个时间段内,缓存中的大量数据同时失效或者大量的请求集中到某一个时间点发生,导致数据库压力骤增,甚至引起服务崩溃的现象。

  • 原因:通常是由于缓存中的大量数据同时过期或者大量的请求集中到某一时间点。例如,如果缓存中的大量数据在同一时间点过期,那么在数据重新加载到缓存之前,所有请求都会直接打到数据库,导致数据库压力骤增。还有一种情况就是缓存中间件宕机。

  • 解决方法:可以采取多种方式来缓解缓存雪崩的影响,例如设置不同的缓存过期时间、使用缓存预热、采用滑动过期时间等。

缓存穿透
  • 定义缓存穿透是指恶意请求或者无效请求直接绕过缓存访问数据库,导致数据库压力过大,甚至造成服务宕机的现象。

  • 原因:通常是由于缓存中不存在的数据被请求,而且这些请求都直接绕过了缓存,直接查询数据库。如果攻击者通过构造恶意请求来访问不存在的数据,就可能触发缓存穿透。

  • 解决方法:可以采取多种方式来防止缓存穿透,例如使用布隆过滤器过滤无效请求、在缓存中预先存储空对象(缓存空值)、设置短期内的黑名单等。

缓存击穿
  1. 定义:

    • 缓存击穿是指一个非常热点的数据,在某个时间点过期了,此时大量的请求同时过来,这些请求发现缓存中没有数据,于是全部去访问数据库,导致数据库压力瞬间增大。

  2. 举例:

    • 比如一个热门商品的库存查询接口,在高并发情况下,这个商品的缓存数据刚好过期,瞬间大量的请求直接打到数据库上,可能导致数据库崩溃。

  3. 解决方案:

    • 设置热点数据永不过期。

    • 加互斥锁,当发现缓存过期时,只有一个线程去查询数据库并更新缓存,其他线程等待。

完整些

背景:在实际应用场景中,我们会在程序和数据库之间增加一个缓存层,用来提高数据检索的效率,同时降低数据库的并发压力。

定义:缓存击穿其实就是缓存层没有起到流量缓冲作用,请求因为某些原因全部打到了数据库中。

原因:我认为主要有两种情况导致:主要针对是否存在键。如果说存在键,在键过期的瞬间,有大量的请求进来,直接打到了数据库中。不存在键,也就是大量不存在key的请求,由于访问的key不存在,导致数据本身不存在。

总结:总之在使用Redis承担流量缓冲作用时,需要考虑失效时导致并发压力过大对后端存储设备造成冲击的问题

解决:

  • 首先可以对热点数据不设置过期时间,或者在每次访问时更新过期时间,来保证每次对热点数据的访问都能在缓冲区找到。

  • 其次可以对访问量较高的数据设置多级缓存数据,尽量减小后端存储设备的压力。

  • 还可以使用分布式锁,在缓存失效时,先去获取分布式锁,在从数据库中查找数据,写回缓存中,后续没有获得锁的线程只能等待和重试就行了,虽然该方案牺牲了一定的性能,但可以有效的保护数据库避免被压垮。

  • 对于恶意攻击类的场景,可以使用布隆过滤器,应用启动的时候把存在的数据缓存到布隆过滤器中,每次请求先经过布隆过滤器,若不存在,这说明数据一定没有在数据库中,没必要访问数据库

缓存预热
  1. 定义:

    • 在系统启动或者新的缓存节点加入时,提前将一些可能被频繁访问的数据加载到缓存中,以避免在系统运行初期用户请求时频繁访问数据库,从而提高系统的响应速度和性能。

  2. 大白话理解:

    • 就好比你要开一家商店,在正式营业前,你先把一些热门商品摆到货架上(把热门数据放到缓存里),这样等顾客(用户请求)来的时候,就能很快地拿到商品(数据),而不用等你从仓库(数据库)里去取货,节省时间,提高顾客的满意度。

缓存更新
  1. 定义:

    • 缓存中的数据发生变化时,需要及时更新缓存中的数据,以保证缓存中的数据与数据库中的数据一致。缓存更新可以通过主动更新或者被动更新的方式实现。

  2. 大白话理解:

    • 假设你的商店里的商品价格发生了变化(数据库中的数据变化了),你就得把货架上(缓存里)的商品价格标签也换一下,这样顾客看到的价格才是正确的。主动更新就是你自己主动去检查商品价格有没有变化,然后更新标签;被动更新就是等顾客发现价格不对告诉你了,你再去更新。

缓存降级
  1. 定义:

    • 当系统面临高并发、高负载或者出现故障时,为了保证核心功能的可用性,暂时降低非核心功能的服务质量或者关闭一些不太重要的功能,将原本需要从缓存中获取的数据改为直接从数据库或者其他数据源获取,或者返回一些默认值、旧数据等。

  2. 大白话理解:

    • 就像你的商店在高峰期的时候,人特别多,货架上的一些不太热门的商品来不及补货(缓存数据无法获取),这时候你就告诉顾客这些商品暂时没货,让他们先买其他热门商品(保证核心功能可用)。或者你直接拿一些旧的商品给顾客看(返回旧数据),等不那么忙的时候再去整理货架(恢复缓存数据)。


http://www.ppmy.cn/devtools/127242.html

相关文章

【海图界面上一些常见术语UTC、HDG、COG、SOG、LAT、LON的基本解释】

当然,以下是关于海图界面上一些常见术语UTC、HDG、COG、SOG、LAT、LON的基本解释: UTC (Coordinated Universal Time) 定义:UTC 是协调世界时(Coordinated Universal Time)的缩写,是一种与地球自转无关的…

Android SELinux——上下文Context介绍(九)

在 SELinux (Security-Enhanced Linux) 中,context(上下文)是一个非常重要的概念,它用于定义系统中的对象(如文件、目录、进程等)的安全属性。每个对象都有一个与之关联的安全上下文,这个上下文决定了对象可以执行的操作以及可以访问哪些其他对象。 一、Context介绍 前…

STC32G12K128库函数操作(LCM使用+I8080波形分析)

1.前言 最近搞在开一个新项目,核心在于低成本,于是重新看回了咱们的老朋友STC。不看不知道,一看吓一跳,STC出的芯片外设真全,涵盖了基础的各种外设。不过嘛,STC嘛,都熟悉。基本的外设很快上手了…

lesson01 Backtrader是什么

[Backtrader]专题连载 Backtrader是什么? Backtrader 是 2015 年开源的 Python 量化回测框架(支持实盘交易)。专注于为量化交易策略提供回测和实盘交易功能。它允许用户集中精力编写可复用的交易策略、指标和分析工具,而无需花费…

Go语言基础学习(Go安装配置、基础语法)

一、简介及安装教程 1、为什么学习Go? 简单好记的关键词和语法;更高的效率;生态强大;语法检查严格,安全性高;严格的依赖管理, go mod 命令;强大的编译检查、严格的编码规范和完整的…

计算机组成原理之高速缓冲存储器

定义: 高速缓冲存储器是一种存取速度比一般随机存取记忆体(RAM)更快的RAM,通常使用SRAM技术。 位置: 它是存在于主存与CPU之间的一级存储器,由静态存储芯片(SRAM)组成。 特点&am…

Android 取消充电动画logo,直接显示图片即可

删除充电动画逻辑,直接设置显示图片logo:hvga_low_battery.bmp vendor/mediatek/proprietary/external/libshowlogo/charging_animation.cpp void show_battery_capacity(unsigned int capacity) { anim_show_logo(LOW_BATTERY_INDEX);//*/rm animat…

C++卓越:全面提升专业技能的深度课程(第一章第一课C++17与C++20概述)

第一章:C的现代化 第一课:C17与C20概述 引言 C是一种强大的编程语言,具有丰富的特性和广泛的应用。随着C17和C20的发布,这些版本引入了大量新特性,进一步增强了语言的灵活性和效率。本课将全面探讨C17与C20的新特性…