【Redis从头学-15】三个通俗例子带你理解Redis缓存击穿、缓存穿透、缓存雪崩并从思路引导三者的解决方案

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis从头学-15】三个通俗例子带你理解Redis缓存击穿、缓存穿透、缓存雪崩并从思路引导三者的解决方案

🌟前言


对于Redis缓存击穿、缓存穿透、缓存雪崩在求职面试中是常问题目。但是看这个字面意思太难理解上述三种现象,而且特别容易混淆。本篇文章就引导思路来让大家彻底理解三种现象以及解决方案。


🌟通俗理解


大家可以这样理解:Key比作一个点。


缓存击穿可以联想到体育运动中的击剑,击中一次代表某个Key失效;(一个点)

缓存雪崩可以联想到雪山中的雪崩景象,一个雪球代表某个key,多个雪球滚落代表多个key失效;(多个点)

缓存穿透可以联想到王者荣耀中的护甲受到真实伤害,假设其中的护甲代表着由密集Key做成的,受到真实伤害代表着你这件护甲根本不存在。(密集点)


🌟缓存击穿


现象:某个热点Key缓存失效,已经过期。

思路引导:


  1. 设置热点Key永不过期:从缓存过期的角度出发,我们想到了一个解决方案那就是设置热点key用不过期。那如果每个热点key都设置时间用不过期,而redis又是基于内存存储缓存,那就会造成性能的下降;此外,如果后端更新这个热点key的数据,而用户在请求的时就会获取到旧的数据。虽然有其缺点,但是也有它的适用场景,那就是适合静态数据即不经常变动的数据。
  2. 定时任务更新缓存:针对第一种解决方案的缺点,我们可以在程序中设置一个定时任务,根据热点Key的访问规律来定期更新缓存数据。
  3. 互斥锁:通过只有一个线程获取到锁来解决缓存击穿。当一个请求从缓存中查找key时,如果获取到null,则会获取锁。获取成功后会从数据库查询数据,并写入缓存。


🌟缓存穿透


现象:热点数据在缓存中根本就不存在。

思路引导:

1.接口层增加数据合理性校验:比如接口地址中传入一个id为-1的商品ID,那肯定数据不存在的。所以从此出发,可以通过对接口参数值增加数据校验,防止别人恶意传参。

2. 设置NULL值:由于是缓存根本不存在,我们可以设置一个空值,来避免缓存穿透的发生。但是,空值太多往往会造成性能的下降。

3. 设置短点的过期时间:过期时间过短是不是会增大缓存击穿的风险呢。

4. 布隆过滤器:通过此过快速检查缓存中是否存在热点KEY。


🌟缓存雪崩


现象:多个热点KEY失效。

思路引导:


  1. 离散过期时间:多个热点key集体失效,可能是设置了相对集中或者相同过期时间的key,可以将过期时间设置的相对分散一些。
  2. 设置Key用不过期并定时任务更新缓存:设置Key永不过期并在程序中设置一个定时任务,根据热点Key的访问规律来定期更新缓存数据。


🌟总结


现象 缓存击穿 缓存穿透 缓存雪崩
描述 某个热点Key缓存失效,已经过期。 热点数据在缓存中根本就不存在。 多个热点KEY失效。
解决方案 1.设置热点Key永不过期;
2.定时任务更新缓存;
3.互斥锁。
1.接口层增加数据合理性校验;
2.设置NULL值;
3.设置短点的过期时间;
4.布隆过滤器。
1.离散过期时间;
2.设置Key用不过期并定时任务更新缓存。


🌟写在最后


有关于从思路上理解Redis缓存击穿、缓存穿透、缓存雪崩及解决方案到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
14天前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
15天前
|
存储 NoSQL Redis
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
Redis持久化、RDB和AOF方案、Redis主从集群、哨兵、分片集群、散列插槽、自动手动故障转移
SpringCloud基础7——Redis分布式缓存,RDB,AOF持久化+主从+哨兵+分片集群
|
26天前
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
Redis中大Key与热Key的解决方案
|
25天前
|
缓存 NoSQL 关系型数据库
MySQL与Redis缓存一致性的实现与挑战
在现代软件开发中,MySQL作为关系型数据库管理系统,广泛应用于数据存储;而Redis则以其高性能的内存数据结构存储特性,常被用作缓存层来提升数据访问速度。然而,当MySQL与Redis结合使用时,确保两者之间的数据一致性成为了一个重要且复杂的挑战。本文将从技术角度分享MySQL与Redis缓存一致性的实现方法及其面临的挑战。
61 2
|
28天前
|
Java UED Maven
紧跟技术潮流:手把手教你构建响应式Vaadin应用,让用户体验无缝接轨!
【8月更文挑战第31天】本文从零开始,详细介绍如何使用强大的Java框架Vaadin构建流畅且响应式的Web应用程序。首先,确保安装JDK 1.8+、Maven 3.3.9+及IDE。接着,创建Maven项目并添加Vaadin依赖。然后,通过继承`UI`类创建主界面,并定义自定义主题与样式。利用Vaadin的响应式布局组件,如`HorizontalLayout`和`VerticalLayout`,实现多设备兼容性。
28 0
|
1月前
|
缓存 NoSQL 网络安全
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
|
1月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
【Azure Redis 缓存】Redission客户端连接Azure:客户端出现 Unable to send PING command over channel
|
1月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Redis 连接失败
【Azure Redis 缓存】Redis 连接失败
|
1月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
【Azure Redis 缓存】Lettuce 连接到Azure Redis服务,出现15分钟Timeout问题
|
30天前
|
缓存 NoSQL Java
Redis深度解析:解锁高性能缓存的终极武器,让你的应用飞起来
【8月更文挑战第29天】本文从基本概念入手,通过实战示例、原理解析和高级使用技巧,全面讲解Redis这一高性能键值对数据库。Redis基于内存存储,支持多种数据结构,如字符串、列表和哈希表等,常用于数据库、缓存及消息队列。文中详细介绍了如何在Spring Boot项目中集成Redis,并展示了其工作原理、缓存实现方法及高级特性,如事务、发布/订阅、Lua脚本和集群等,帮助读者从入门到精通Redis,大幅提升应用性能与可扩展性。
58 0