redisredis缓存穿透和雪崩

王六六的IT日常 王六六的IT日常     2023-02-17     302

关键词:

👉视频:【狂神说Java】Redis最新超详细版教程通俗易懂
👇
学习笔记
Redis学习结束,继续消化补充~~~~

Redis缓存穿透和雪崩(面试高频,工作常用)

服务的高可用问题

Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时也带来了一些问题,其中最要害的问题就是数据的一致性问题,从严格意义上讲这个问题无解。如果对数据的一致性要求很高,那么就不能使用缓存。
另外的一些典型问题就是,缓存穿透、缓存雪崩和缓存击穿。目前,业界也都有比较流行的解决方案。

缓存穿透(查不到导致)

概念

缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中(秒杀!),于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

解决方案

布隆过滤器

布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力;

缓存空对象

当存储层不命中后,即使返回的空对象也将其缓存起来,同时会设置一个过期时间,之后再访问这个数据将会从缓存中获取,保护了后端数据源;


但是这种方法会存在两个问题:
1、如果空值能够被缓存起来,这就意味着缓存需要更多的空间存储更多的键,因为这当中可能会有很多的空值的键;
2、即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口的不一致,这对于需要保持一致性的业务会有影响。

缓存击穿(量太大,缓存过期导致)

微博服务器宕机(大家都在看热搜)

概述

缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且回写缓存,会导使数据库瞬间压力过大。

解决方案

1.设置热点数据永不过期

从缓存层面来看,没有设置过期时间,所以不会出现热点 key 过期后产生的问题。

2.加互斥锁

分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的考验很大。

缓存雪崩

概念

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

产生雪崩的原因之一,比如在写本文的时候,马上就要到双十二零点,很快就会迎来一波抢购,这波商品时间比较集中的放入了缓存,假设缓存一个小时。
到了凌晨一点钟的时候,这批商品的缓存就都过期了。
而对这批商品的访问查询,都落到了数据库上,对于数据库而言,就会产生周期性的压力波峰。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

其实集中过期,倒不是非常致命,比较致命的是缓存雪崩,是缓存服务器某个节点宕机或断网。因为自然形成的缓存雪崩,一定是在某个时间段集中创建缓存,这个时候,数据库也是可以顶住压力的。无非就是对数据库产生周期性的压力而已。而缓存服务节点的宕机,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。
【双十一停掉一些服务:退款(保证主要的服务可用)】

解决方案

1.redis高可用

这个思想的含义是,既然redis有可能挂掉,那我多增设几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群。(异地多活)

2.限流降级(在SpringCloud中)

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

3.数据预热

数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

redisredis的缓存使用技巧(商户查询缓存)(代码片段)

文章目录1.什么是缓存2.添加Redis缓存2.1缓存工作模型2.2代码实现3.缓存更新策略3.1缓存更新策略类型3.2主动更新策略3.3超时剔除和主动更新缓存实现4.缓存穿透4.1基本介绍4.2通过缓存空对象解决缓存穿透问题5.缓存雪崩6.缓存击穿6... 查看详情

redisredis的缓存使用技巧(商户查询缓存)(代码片段)

文章目录1.什么是缓存2.添加Redis缓存2.1缓存工作模型2.2代码实现3.缓存更新策略3.1缓存更新策略类型3.2主动更新策略3.3超时剔除和主动更新缓存实现4.缓存穿透4.1基本介绍4.2通过缓存空对象解决缓存穿透问题5.缓存雪崩6.缓存击穿6... 查看详情

redis缓存雪崩和缓存穿透缓存预热缓存降级

Redis缓存雪崩和缓存穿透、缓存预热、缓存降级缓存雪崩大量的key同时失效由于原有缓存失效,新缓存还没有存入到redis的期间比方说:我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期,... 查看详情

redis学习笔记10:redis缓存穿透和雪崩

        Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那... 查看详情

redis缓存穿透缓存击穿缓存雪崩的原理和解决办法(代码片段)

Redis缓存穿透、缓存击穿、缓存雪崩的原理和解决办法1.前言2.缓存穿透的解决办法3.缓存击穿解决办法4.缓存雪崩的解决办法1.前言在大数据时代,由于网络请求的并发,导致的数据库I/O开销巨大,所以为了缓解数据库的压力,缓... 查看详情

redis缓存穿透缓存击穿缓存雪崩的原理和解决办法(代码片段)

Redis缓存穿透、缓存击穿、缓存雪崩的原理和解决办法1.前言2.缓存穿透的解决办法3.缓存击穿解决办法4.缓存雪崩的解决办法1.前言在大数据时代,由于网络请求的并发,导致的数据库I/O开销巨大,所以为了缓解数据库的压力,缓... 查看详情

专项测试系列-缓存击穿穿透雪崩专项测试

作者:刘须华一、背景概述: R2M缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。而缓存最常见的问题是缓存穿透、击穿和雪崩,在高并发下这三种情况都会有大量请求落到数据库,导致数据库资源... 查看详情

redis的缓存穿透和缓存雪崩

Redis的缓存穿透和缓存雪崩  先想一想,redis缓存作为数据库前面的一道门槛,它能极大的减少了直接访问数据库而造成的数据库崩溃,但是此时缓存中没有所访问的数据,用户是会直接访问数据库,那么此... 查看详情

redis缓存穿透和雪崩

一、什么是缓存穿透?定义:客户端查询了一个数据库中没有的记录导致缓存在这种情况下无法利用,称之为缓存穿透或者缓存击穿。如图,这是提条正常的查询语句,客户端查询id为“1”的这样一条记录,这... 查看详情

什么是缓存穿透缓存雪崩及解决缓存穿透雪崩解决方案实现(代码片段)

(目录)1、缓存穿透问题的解决思路缓存穿透:常见的解决方案有两种:缓存空对象布隆过滤缓存空对象思路分析:布隆过滤:①编码解决商品查询的缓存穿透问题:核心思路如下:在原来的逻辑中:现在的逻辑中:代码:/***查... 查看详情

缓存之缓存击穿缓存穿透和缓存雪崩

...f0c;分布式已经成为当今大中型IT架构事实标准。而分布式缓存也基本成为其中的基础设施,在此方面Redis已经获得全面胜利。为什么要使用缓存主要思想还是以空间换时间,为了节约CUP及IO资源,进而提高系统的吞吐... 查看详情

redis----常见重点知识2(主从复制哨兵机制缓存穿透和雪崩)(代码片段)

...介绍1.2配置二、哨兵机制2.1哨兵概念介绍2.2配置哨兵三、缓存穿透与缓存雪崩2.1缓存穿透2.2缓存雪崩一、主从复制1.1介绍主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(主服务... 查看详情

redis之缓存穿透击穿雪崩问题与缓存删除淘汰策略(代码片段)

一、缓存问题与解决缓存穿透缓存穿透是指查询缓存和DB中都不存在的数据。缓存穿透示例:publicStationfindProjectStation(LongstationId)//从缓存中查询Stationstation=(Station)redisTemplate.boundHashOps("project_station").get(stationId);if(station==null)// 查看详情

redis之缓存穿透击穿雪崩问题与缓存删除淘汰策略(代码片段)

一、缓存问题与解决缓存穿透缓存穿透是指查询缓存和DB中都不存在的数据。缓存穿透示例:publicStationfindProjectStation(LongstationId)//从缓存中查询Stationstation=(Station)redisTemplate.boundHashOps("project_station").get(stationId);if(station==null)// 查看详情

缓存穿透雪崩

缓存穿透问题查询缓存中不存在的数据时,每次都要查询数据库。解决缓存穿透的通用方案是: 给所有指定的key预先设定一个默认值,比如空字符串“Null” 缓存并发问题如果没有读取到数据,那么就在Redis中使用setNX方... 查看详情

redis分布式缓存知识拓展1--处理缓存失效穿透和雪崩问题

对缓存设计中的7大经典问题,如下图,进行问题描述、原因分析,并给出日常研发中,可能会出现该问题的业务场景,最后给出这些经典问题的解决方案。首先学习缓存失效、缓存穿透与缓存雪崩。一、缓存... 查看详情

redis12_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情

redis12_缓存雪崩缓存穿透基于布隆过滤器解决缓存穿透的问题缓存击穿基于缓存击穿工作实际案例(代码片段)

文章目录①.缓存雪崩②.缓存穿透③.在centos7下布隆过滤器2种安装方式④.缓存击穿⑤.高并发的淘宝聚划算案例落地①.缓存雪崩①.问题的产生:缓存雪崩是指缓存数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至... 查看详情