1. 什么是缓存穿透?
- 查询的key在redis中不存在
- 对应的id在数据库也不存在
- 此时被非法用户进行攻击,大量的请求直接打在db上,造成宕机,这种现象叫做缓存穿透
2. 解决方案:缓存空数据
- 把空的数据也缓存起来,比如:空字符串、空对象、空数组等等
3. 解决方案:布隆过滤器
- 如图所示,通过维护一个数组,把请求的key是否存在缓存中的结果保存在数组中,0表示不存在,1表示存在,在进入Redis缓存查询key之前,先来到这个数组中查看key是否为1,比如:在该数组中查找subCat:1是否为1,如果为1,那么再去Redis中查找这个key;如果为0,那么直接去数据库中查找。这样子就省去了去Redis的查找过程
- 布隆过滤器增加了代码的复杂度,而且并没有比去缓存中查找key快多少,因为都是在缓存中进行的,所以不推荐使用