Redis 缓存穿透、缓存击穿、缓存雪崩 等经典问题解读

由于基本看完了 《Redis 设计与实现》中的单机部分内容,所以就可以看一些面试常常会问到的相关问题,带着问题去学习,这样效率会更高。

缓存穿透

简介

缓存穿透(缓存击穿) 表示恶意用户请求很多不存在的数据,由于数据库中都没有,缓存中肯定也没有,导致这些请求短时间内直接落在了数据库上,导致数据库异常。

解决方案

1:缓存空值

    之所以发生穿透,就是因为缓存中没有存储这些空数据的 key。从而导致每次查询都到数据库去了。那么我们就可以为这些 key 对于的值设置为 null 丢到缓存里面去。后面再查询这个 key  的请求的时候,直接返回 null。这样就不用到数据库中去走一圈了,但是别忘了设置过期时间。

2:布隆过滤器

    BloomFilter 类似于一个 hash set , 用来判断某个元素 (Key) 是否存在于某个集合中,这种方案可以加在第一种方案中,在缓存之前在加一层 BloomFilter, 在查询的时候先去 BloomFilter 去查询 Key 是否存在,如果不存在就直接返回,存在再走 查缓存--->查 DB 的流程。

方案选择

特点:Key 比较多,请求重复率低:

    针对一些恶意攻击,攻击带过来的大量 Key 是不存在的,那么我们采用第一种方案就会缓存大量不存在Key 的数据。所以采用第二种方案;

特点:空数据的 Key 有限,重复率比较高:

    可采用第一种方案;

缓存击穿

缓存雪崩

双写一致性问题

并发竞争问题

参考资料:

https://juejin.im/post/5c9a67ac6fb9a070cb24bf34

上一篇:Redis详解(十三)------ Redis布隆过滤器


下一篇:爬虫