题1讲讲缓存穿透以及解决方案概念缓存穿透是指查询一个一定不存在的Key导致缓存未命中每次请求都打到数据库可能压垮数据库。解决方案缓存空值第一次查询数据库发现不存在时在缓存中存空值并设置过期时间防止重复查询减轻数据库压力布隆过滤器插入Key前先通过布隆过滤器判断Key是否可能存在不存在则直接返回不访问数据库题2讲讲布隆过滤器是什么解决了什么问题解决问题防止缓存穿透拦截不存在Key的请求底层原理初始化一个大的二进制数组全0插入Key时经过多次哈希例如3次每次对数组长度取余 → 得到数组下标将三个下标对应位置置1查询Key时同样哈希检查三个位置都为1 → Key可能存在任意为0 → Key一定不存在误判原因不同key哈希到数组同一位置导致未存key被误判为存在误判率控制调整数组长度和哈希函数数量一般设置 ≤5%可满足大多数项目需求题3讲讲缓存击穿是什么与穿透的区别以及解决方案概念Key存在但刚好过期时高并发访问同一Key缓存未命中大量请求打数据库可能压垮数据库区别于缓存穿透穿透 查询一个一定不存在的Key击穿 查询存在的Key但恰好过期解决方案互斥锁 / 分布式锁第一个访问过期Key的线程加锁访问数据库并刷新缓存其他线程等待或重试保证数据库压力不被瞬时放大适用于强一致得场景逻辑过期缓存存入时不设置过期时间查询时判断是否过期过期 → 异步线程刷新缓存当前线程直接返回旧值适用于高并发场景但可能返回旧值题4讲讲缓存雪崩是什么以及解决方案概念大量Key在同一时间过期高并发请求同时到来缓存未命中大量请求直接打到数据库可能压垮数据库解决方案TTL随机化在原有过期时间上随机加几分钟避免大批Key同时过期缓存预热定时将热点Key提前加载到缓存避免冷启动阶段请求打数据库多级缓存本地缓存 Redis分布式缓存 数据库即使Redis部分失效本地缓存仍可拦截部分请求降低瞬时压力