首页 > 数据库 >Redis缓存击穿、缓存穿透、缓存雪崩

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

时间:2024-09-29 15:20:56浏览次数:8  
标签:缓存 请求 过期 数据库 Redis 访问 雪崩 数据

缓存击穿、缓存穿透和缓存雪崩是缓存机制中常见的问题,它们各自具有不同的特点和解决方案。下面我将分别解释这三种现象及其解决方案。

一、缓存击穿

缓存击穿指的是在高并发情况下,某个热点数据缓存失效,导致大量请求直接访问数据库,给数据库带来巨大压力。这通常发生在某个被频繁访问的缓存键过期时,新的请求无法从缓存中获取数据,而需要直接查询数据库。

解决方案

互斥锁(Mutex):在缓存失效时,使用互斥锁或分布式锁来保护数据加载过程,确保只有一个线程去查询数据库,其他线程等待结果返回。这样可以避免大量请求同时访问数据库。
逻辑过期:不设置缓存的过期时间,而是在缓存数据中添加一个逻辑过期时间的字段。当访问缓存时,先判断逻辑过期时间,如果过期,则开启一个新的线程去查询数据库并更新缓存,而当前请求则直接返回旧数据。
热点数据缓存永不过期:对于热点数据,可以设置其缓存永不过期,后台定期异步更新缓存数据。

二、缓存穿透

缓存穿透是指查询一个不存在的数据,由于缓存中没有数据,这个查询请求会直接穿过缓存层到达数据库层,造成数据库的压力。这通常发生在恶意请求或无效的请求导致缓存和数据库都无法命中时。

解决方案

接口校验:在请求到达前,对请求参数进行合法性验证,如过滤非法字符、判断参数范围等,过滤掉无效或恶意的请求。
空值缓存:当请求的数据在缓存和数据库中都不存在时,将空值(如null)缓存起来,并设置一个较短的过期时间。这样,当再次查询相同的数据时,就可以直接从缓存中返回空值,避免访问数据库。
布隆过滤器(BloomFilter):使用布隆过滤器对请求进行预处理,过滤掉可能不存在的数据。布隆过滤器通过hash算法将元素映射到一个很大的bit数组中,通过判断bit数组中的值来判断元素是否存在。虽然存在误判的可能,但可以大大减少数据库的压力。

三、缓存雪崩

缓存雪崩指的是在某个时间段内,缓存中大量的数据同时失效,导致大量请求直接访问数据库,给数据库带来巨大压力。这通常发生在缓存服务器宕机、大规模数据过期或同时失效时。

解决方案

设置不同的缓存过期时间:将缓存的过期时间设置为分散的随机值,避免大量缓存同时过期。
使用多级缓存:在缓存层引入多级缓存架构,如本地缓存和分布式缓存,提高缓存的可用性和稳定性。
缓存预热:在系统低峰期,提前加载热点数据到缓存中,避免在高峰期大量请求同时访问数据库。
服务降级和限流:在缓存不可用或数据库压力过大时,对服务进行降级处理,暂时屏蔽一些非核心功能,同时限制对数据库的访问频率,减轻数据库压力。
综上所述,缓存击穿、缓存穿透和缓存雪崩是缓存机制中常见的问题,但通过合理的缓存设计、缓存过期时间的设置、数据预热、使用锁、布隆过滤器等措施,可以有效地缓解这些问题对系统性能和数据库压力的影响。

标签:缓存,请求,过期,数据库,Redis,访问,雪崩,数据
From: https://blog.csdn.net/qq_41354522/article/details/142636294

相关文章

  • Redis渐进式rehash
    为什么要渐进式rehash?在Redis中,哈希表是实现快速键值对查找的关键数据结构,但随着数据的增加,哈希表可能会因为冲突过多或空间不足而需要扩容;相反,当数据大量删除后,哈希表也可能因为空间利用率过低而需要缩容。在扩容和缩容过程中,由于长度变化会导致key的索引变化,为了避免一次性r......
  • 如何修改Nuget包的缓存路径
    默认Nuget包的缓存路径是%userprofile%\.nuget\packages,例如C:\Users\Administrator\.nuget\packages。因为这个路径是在C盘下的,所以在使用久了以后,会导致C盘容量骤减。 正常在VisualStudio中引入Nuget包时,会先在缓存文件夹判断,如果存在,就直接复制到项目文件夹下,不存到,就到Nu......
  • Redis小白学习笔记1
    目录这3篇文章是我在学习Redis的过程中,总结的笔记:第一篇Redis学习笔记1-理论篇1,Redis中的数据类型2,Redis的IO模型3,Redis的持久化4,Redis集群原理5,将Redis用作缓存第二篇Redis学习笔记2-性能篇6,Redis高性能的影响因素6.1,Redis内部的阻塞式操作......
  • pbootcms网站自动清理runtime缓存方法
    为了实现自动清理缓存目录的功能,可以按照以下步骤进行:备份相关文件:在进行任何修改之前,请确保备份所有相关文件和数据库,以防修改过程中出现错误导致数据丢失。定位并修改ExtLabelController.php文件:打开/apps/home/controller/ExtLabelController.php文件。在test()方法......
  • Python对数据库(MySQL,redis、MongoDB)的操作
    Python对数据库的操作(MySQL,redis、MongoDB)一、操作MySQL数据库安装pymysql:需要通过pipinstallpymysql进行安装。查询数据:fetchone、fetchmany(n)、fetchall()importpymysql#建立mysql连接,ip、端口、用户名、密码(passwd,不能写成其他,例如:pwd或者p,否则报错)、库名con......
  • 算法实战:剖析 Redis 常用的数据类型对应的数据结构
    算法实战:剖析Redis常用的数据类型对应的数据结构Redis是一个非常流行的内存数据库,它提供了多种数据类型,每种数据类型都有其特定的数据结构支持。了解这些数据结构对于深入理解Redis的工作原理和优化使用非常重要。本文将剖析Redis常用的数据类型对应的数据结构,并通......
  • Redisson详解
    Redisson是Redis的一个分布式锁实现库,它提供了简单易用的API来处理分布式锁。在处理未获取到锁的线程时,Redisson通过合理的机制来管理等待和超时行为,确保锁的竞争有序并防止资源的长期占用。具体来说,Redisson处理未获取到锁的线程的方式如下:1.等待锁(可配置超时时间)当......
  • Redis 五大基本数据类型及其应用场景进阶(缓存预热、雪崩 、穿透 、击穿)
    Redis数据类型及其应用场景Redis是什么?Redis是一个使用C语言编写的高性能的基于内存的非关系型数据库,基于Key/Value结构存储数据,通常用来缓解高并发场景下对某一资源的频繁请求,减轻数据库的压力。它支持多种数据类型,如字符串、哈希、列表、集合、有序集合等。Redis......
  • Redis学习笔记
    一、Redis简介1.1NOSQLNoSQL(NoSQL=NotOnlySQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型,web2.0纯动态网站已经显得力不从心,暴露了很多难以克服......
  • Redis 集合类型详解及应用
    ......