【Redis篇02】redis 缓存-缓存穿透(DB与缓存都不存在)

72 阅读2分钟
redis准备
作为缓存中间件在项目中的普遍性,以及在面试中占据的高比重。
  • redis 使用场景 缓存、分布式锁、计数器、保存token、消息队列以及延迟队列实现等

  • 其他面试问题 集群相关内容、redis实现的事务以及性能优势等

缓存相关面试题

缓存穿透、击穿、雪崩以及解决方案

双写一致问题

redis持久化问题

数据过期策略

数据淘汰策略

分布式锁也是面试常见内容

涉及redis实现的分布式锁及底层实现原理

setnx redission

消息队列、延迟队列

何种数据类型


缓存穿透概念:

根据文章id查询详情的需求; request --> redis(未查询到) ---> DB -->response (db中查询到,写入到redis)

image.png

常出现在有人故意攻击,故意使用些不存在的id伪造请求服务

数据库并发并不高,当请求到一定量时就会击垮数据库,导致宕机。


解决方案:
方案一:直接缓存null
缺点:缓存的压力变大,数据造成不一致

方案二:使用Bloom Filter

特性:查询快、可能出现假阳性(一个不在集合中元素时,可能出现错误地报告),无假阴性(如果布隆过滤器报告某个元素不存在时,那么可以确定该元素确实不存在)

缺点:存在误判率

实现方案:redisson、 guava

redisson 具体有布隆过滤器实现:

  • 基础布隆过滤器RBloomFilter:不支持删除,适用不需要删除元素的场景
  • 计数器型布隆过滤器RCountingBloomFilter:支持删除,使用计数器来跟踪每个位置被置为1的次数
  • 布谷鸟布隆过滤器RProbabilisticSet:支持删除,使用指纹来替代全量数据,通过布谷鸟机制解决哈希冲突。适用于需要删除操作且希望有较低空间开销的场景

guava 具体有布隆过滤器实现:

  • 标准布隆过滤器:使用固定的位数组,不支持删除操作,适合不需要删除元素的场景、可以设置插入元素的数量和可接受的最大误报率
  • 自定义哈希函数:需要特定哈希逻辑的场景
  • 使用不同的数据类型:适用不同的数据类型的成员检查
源码