缓存存在的问题:缓存穿透、缓存击穿、缓存雪崩

简介: 缓存穿透是指数据库和缓存都没有的数据,每次都要经过缓存直接去访问数据库,大量的请求打到DB可能导致DB宕机。

🍀缓存穿透

缓存穿透是指数据库和缓存都没有的数据,每次都要经过缓存直接去访问数据库,大量的请求打到DB可能导致DB宕机。

强调都没有数据+并发访问

image-20220803150249711

如果请求一条DB中不存在的数据,此时缓存是不命中的,会请求到DB中,DB查询不到数据因此也不会同步缓存,每次请求都要请求到DB去查询,失去了缓存的意义。在并发访问时,大量请求打到DB,DB可能就会宕机。

☘️解决思路

思路一:由于缓存穿透是因为缓存没有生效,是否可以针对DB不存在的数据设置缓存空值,让请求到缓存就OK。缓存的有效时间可以设置短点,如30s,避免误伤正常业务。

思路二:采用布隆过滤器 (Bloom Filter) ,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个不存在的数据会被这个 bitmap 拦截掉,从而避免了对DB的查询压力。

布隆过滤器原理:当一个元素被加入集合时,通过k个散列函数将这个元素映射成一个位数组中的k个点,并将其置为1。当查询时,将元素通过散列函数得到k个点,如果这些点存在不为1的,则被检元素一定不存在,直接返回;如果都是1,则查询元素可能存在,就会查询缓存和DB。

🍀缓存击穿

缓存击穿是指数据库有,缓存没有的数据,大量请求访问这个缓存不存在的数据,最后请求打到DB可能导致DB宕机。

强调单个Key过期+并发访问

image-20220803152530761

缓存击穿区别缓存穿透在于,缓存击穿是大量请求同时查询同一个key,而这个key失效了,导致大量请求打到DB,导致DB可能宕机。缓存穿透是请求DB中不存在的数据。

☘️解决思路

思路一:加分布式锁(高并发转低并发),第一个请求的线程拿到锁之后查询DB,并同步缓存,其余线程获取锁失败后会等待一段时间(如50ms),然后重新到缓存中获取数据,将访问DB(慢设备)时高并发转低并发。

思路二:对于热点数据采用隔离环境,即便热点环境宕机也不会影响到正常环境,一般而言不需要隔离,其成本比较大,只有在大型活动中才可能采用,如618、双11等。

image-20220803154122598

思路三:保证热点数据在缓存中,可以设置热点缓存数据永不过期;或者采用定时任务去定时刷新缓存数据与过期时间,保证缓存数据存在。

🍀缓存雪崩

缓存雪崩是指数据库有,缓存没有的数据,大量请求访问这些缓存不存在的数据,最后请求打到DB可能导致DB宕机。

强调批量Key过期+并发访问

image-20220803154646324

缓存雪崩在于大量的缓存key失效,大量请求全部打到DB,DB可能会因为瞬时大流量压力而宕机。

☘️解决思路

思路一:由于是设置的key过期时间一样,导致同一时间大量数据失效。我们可以改变缓存失效时间,在原有失效时间上增加一个随机值,最终的目的是让数据分散在不同的时间点过期。

🍀缓存一致性

缓存一致性指的是缓存与DB之间的数据一致性,我们需要通过各种手段来防止缓存与DB不一致,我们要保证缓存与DB的数据一致或者数据最终一致。

目录
相关文章
|
6天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
1月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
5天前
|
存储 缓存 NoSQL
基于SpringBoot+Redis解决缓存与数据库一致性、缓存穿透、缓存雪崩、缓存击穿问题
这篇文章讨论了在使用SpringBoot和Redis时如何解决缓存与数据库一致性问题、缓存穿透、缓存雪崩和缓存击穿问题,并提供了相应的解决策略和示例代码。
16 0
|
1月前
|
缓存 NoSQL Redis
使用Redis实现缓存穿透的解决方案
使用Redis实现缓存穿透的解决方案
|
29天前
|
缓存 数据库
高并发架构设计三大利器:缓存、限流和降级问题之应对缓存击穿问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之应对缓存击穿问题如何解决
|
1月前
|
缓存 NoSQL Redis
使用Redis实现缓存穿透的解决方案
使用Redis实现缓存穿透的解决方案
|
2月前
|
缓存 NoSQL Java
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
Redis系列学习文章分享---第四篇(Redis快速入门之Java客户端--商户查询缓存+更新+双写一致+穿透+雪崩+击穿+工具封装)
40 0
|
23天前
|
缓存 NoSQL Java
Redis 缓存与数据库数据不一致问题
Redis 缓存与数据库数据不一致问题
50 3
|
18天前
|
缓存 NoSQL 关系型数据库
(八)漫谈分布式之缓存篇:唠唠老生常谈的MySQL与Redis数据一致性问题!
本文来聊一个跟实际工作挂钩的老生常谈的问题:分布式系统中的缓存一致性。
72 10