黑马点评项目实战(二)——缓存穿透与缓存雪崩
缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。例如,一个不怀好意的黑客同时间内大量请求不存在的数据,这些请求都会打到数据库上,导致数据库 崩溃。
常见的解决方案有两种:缓存空对象和布隆过滤。
其他解决方案:增强id的复杂度,避免被猜测id规律;做好数据的基础格式校验;加强用户权限校验;做好热点参数的限流。
缓存空对象
- 优点:实现简单,维护方便
- 缺点:
- 额外的内存消耗(解决:设置TTL)
- 可能造成短期的不一致
布隆过滤
Redis中布隆过滤器底层为一个大型位数组(二进制数组)+多个无偏hash函数
优点:内存占用较少,没有多余key
缺点:
- 实现复杂
- 存在误判可能(可能有数据不存在但放行的情况)
业务实现(使用缓存空对象)
缓存雪崩
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

解决方案:
给不同的Key的TTL添加随机值,用以预防同一时段大量的缓存key同时失效
利用Redis集群提高服务的可用性
给缓存业务添加降级限流策略
给业务添加多级缓存