由于基本看完了 《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