Redis中缓存穿透/击穿/雪崩问题和解决方法

 更新时间:2021年12月03日 09:27:03   作者:静静子♡  
大家好,本篇文章主要讲的是Redis中缓存穿透/击穿/雪崩问题和解决方法,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下哦,方便下次浏览

缓存问题

1. 缓存穿透---查不到

缓存穿透是指用户想查询一个数据,发现Redis中没有,也就是缓存没有命中,就向持久性数据库发起查询,发现数据库也没有这个数据,于是查询失败了。

当用户请求很多的情况下,缓存没有命中,数据库也没有数据,会给数据库造成很大的压力,这就是缓存穿透。

解决方案

第一种解决方案:使用布隆过滤器

使用布隆过滤器之后,将存储的数据放入布隆过滤器中,每次数据查询首先查询布隆过滤器,当在过滤器中判断存在时,再到缓存查询,如果没有,再进入数据查询。

如果在布隆过滤器中不存在,则直接返回告诉用户该数据查不到,这样能大大减轻数据库查询压力。

第二种方案:缓存空对象

当数据库数据不存在时,将返回的空对象缓存起来,同时设置一个过期时间,之后在访问数据时,将从缓存中获取,从而保护了数据库。

存在问题:

对空值设置过期时间,会存在更新数据库数据到缓存数据失效的这一段时间,缓存数据有问题(问题在于缓存的空对象数据,由于还没有过期,但此时数据库数据已经更新了),会对要保证数据一致性的业务造成影响。会需要更多的空间来存储更多的控制,造成内存中有大量的空值的键。

2. 缓存击穿---量太大,缓存过期

缓存击穿是指一个热点key,在不停的扛着大量的并发,当key在失效的瞬间,持续的大并发就会穿破缓存,直接请求到数据库。对数据库造成瞬间压力过大。

解决方案

第一种方案:热点数据永不过期

从缓存角度看,没有设置过期时间,就不会存在缓存过期之后产生的问题。

第二种方案:加互斥锁

使用分布式锁,保证对每个key的访问同一时刻只能一个线程去查询后端服务,其他没有获取锁权限的线程则等待即可。

3. 缓存雪崩

缓存雪崩是指在某一个时间段,缓存集中过期失效或者Redis宕机

对于数据库而言,所有请求压力会全部到达数据库,导致数据库调用量暴增,可能也造成数据库宕机的情况

解决方案

第一种方案(预防为主):Redis采用高可用

这种方案的思路就是集群使用,即使一个redis挂掉,其他redis还可以继续服务。

第二种方案(降低发生时所造成的危害):限流降级

这种思路就是在缓存失效后,通过加锁或者队列来控制读取数据库的线程数量让线程在队列排队,控制整体请请求速率。

第三种方案:数据预热

数据预热即是在正式部署服务之前,先访问一遍数据,可以将大部分的数据加载到缓存中,在即将发生大并发之前已经加载不同的key,设置不同的过期时间,让缓存失效的时间更加均匀。

到此这篇关于Redis中缓存穿透/击穿/雪崩问题和解决方法的文章就介绍到这了,更多相关Redis缓存穿透/击穿/雪崩问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis整合SpringBoot的RedisTemplate实现类(实例详解)

    Redis整合SpringBoot的RedisTemplate实现类(实例详解)

    这篇文章主要介绍了Redis整合SpringBoot的RedisTemplate实现类,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Redis实现分布式锁的实例讲解

    Redis实现分布式锁的实例讲解

    在本篇文章里小编给大家整理了一篇关于Redis实现分布式锁的实例讲解内容,有兴趣的朋友们可以学习参考下。
    2021-12-12
  • redis禁止几个危险命令的方法

    redis禁止几个危险命令的方法

    今天小编就为大家分享一篇redis禁止几个危险命令的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Redis在项目中常见的12种使用场景示例和说明

    Redis在项目中常见的12种使用场景示例和说明

    Redis是一个开源的高性能键值对数据库,它以其内存中数据存储、键过期策略、持久化、事务、丰富的数据类型支持以及原子操作等特性,在许多项目中扮演着关键角色,以下是整理的12个Redis在项目中常见的使用场景举例说明和解释
    2024-06-06
  • 如何操作Redis和zookeeper实现分布式锁

    如何操作Redis和zookeeper实现分布式锁

    这篇文章主要介绍了如何操作Redis和zookeeper实现分布式锁的相关资料,需要的朋友可以参考下
    2017-07-07
  • Redis IP地址的绑定的实现

    Redis IP地址的绑定的实现

    这篇文章主要介绍了Redis IP地址的绑定的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • redis键空间通知使用实现

    redis键空间通知使用实现

    这篇文章主要介绍了redis键空间通知使用实现
    2021-08-08
  • redis安装和配置_动力节点Java学院整理

    redis安装和配置_动力节点Java学院整理

    这篇文章主要介绍了redis安装和配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Redis缓冲区溢出及解决方案分享

    Redis缓冲区溢出及解决方案分享

    Redis缓冲区溢出是指Redis缓冲区被写入的数据超过了它的容量,导致数据无法存储或被覆盖。造成缓冲区溢出的原因可能是快速写入大量数据、缓冲区未及时刷新或Redis服务器配置不当等。
    2023-04-04
  • Redis报错UnrecognizedPropertyException: Unrecognized field问题

    Redis报错UnrecognizedPropertyException: Unrecognized 

    在使用SpringBoot访问Redis时,报错提示识别不了属性headPart,经过排查,发现并非Serializable或getset方法问题,而是存在一个方法getHeadPart,但无headPart属性,解决方案是将getHeadPart改为makeHeadPart
    2024-10-10

最新评论