缓存三剑客(穿透,雪崩,击穿)理解

缓存穿透

概念理解

缓存穿透正如其名穿透,说明访问的数据在缓存和数据库里都没用,而且此时还大量的发起了访问,导致数据库崩溃

解决方法

一、第一种解决方法就是保存空值在数据库里面,但是这种情况会很消耗空间

二、第二种办法就是使用布隆过滤器,当有数据来访问的时候,布隆过滤器检查一下如果缓存里没有,直接返回回去,此时布隆过滤器也有一定的弊处,假如我此时访问的数据是刚刚好过了我redis的过期时间,但是此时mysql里面还有数据,那不就可惜了吗?所以有一种方式叫缓存预热(缓存预热就是相当于我设置的数据过期时间是个假时间,什么意思呢?就是相当于我过期时间到了但是我不会将此时在缓存里的数据删除,而是将这个旧数据一直存储在缓存当中,当有数据访问这个缓存的时候,我先返回旧数据,再向数据库发请求获取新数据来更新,但是如果用了缓存预热这种技术的话就不能再使用惰性删除了)

缓存雪崩

概念理解

缓存雪崩,这个也如其名雪崩,为什么会雪崩呢?首先最先能想到的就是redis宕机了,缓存不管用了,大量数据打到了数据库上,还有什么原因呢?还有就是大量缓存失效了,同样会造成大量数据打到数据库上,造成数据库崩溃。那么应该如何解决呢?

解决方法

一、首先便是给每个缓存设置过期时间,避免大量缓存同时失效的情况

二、还能用分布式锁来做一个限制,当缓存失效之后,只允许一个请求进数据库来获取,其他的请求等待,这样的话不好的也就是会造成等待时间很长

缓存击穿

概念理解

对于缓存击穿而言,那就很简单了,他是击穿而不是穿透,说明了什么说明了他在数据库里有,也就说明此时是一个高频请求,怎么会造成这种影响呢?首先最应该想到的就是一个高频请求的缓存key失效了,导致所有的请求都打在数据库上

解决方法

一、此时能怎么解决呢?首先就是获取一个互斥锁,如果获取成功则直接从数据库中获取数据并更新缓存,避免其他请求同时访问数据库

二、其次就是设置热点key的ttl永不过期,或者使用缓存预热也可以。

相关推荐
qq_485015211 小时前
Redis及其他缓存
缓存
Flying_Fish_roe12 小时前
分布式锁-缓存一致性问题-失效模式
分布式·缓存
小汤猿人类19 小时前
uniapp数据缓存和发起网络请求
java·缓存·uni-app
水w21 小时前
如何保证Redis与Mysql双写一致性?
java·开发语言·数据库·redis·mysql·缓存
Will_11301 天前
redis数据类型
数据库·redis·缓存
shall_zhao1 天前
黑马点评19——多级缓存-缓存同步
redis·缓存
洋芋土豆1 天前
Redis Universe: 探索无边界的数据处理星系
数据库·redis·缓存
机智的小神仙儿1 天前
大家好,我叫Redis~
数据库·redis·缓存
shall_zhao1 天前
黑马点评18——多级缓存-OpenResty
redis·缓存·lua·openresty
椰椰椰耶1 天前
【redis】redis的特性和主要应用场景
数据库·redis·缓存