缓存穿透
- 问题:
缓存穿透是指客户端请求的数据在数据库中根本不存在,从而导致请求穿过缓存,直接打到数库的问题 - 常见的两种解决方案:
(1) 缓存空对象
优点:实现简单,方便维护
缺点:额外占用内存
(2)布隆过滤器
优点:内存占用少
缺点:实现复杂,存在误判可能
缓存雪崩
- 问题
缓存雪崩是指同一时段大量的按缓存 key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
- 大量的缓存 key 失效
- 解决方法
给不同的 key 的 TTL添加随机值
- Redis服务宕机
- 解决方法
(1)利用 Redis 集群提高服务的可用性
(2)给缓存业务添加降级限流策略
(3)给业务添加多级缓存
缓存击穿
-
问题
缓存击穿问题也叫热点 key 问题,就是一个被高并发访问并且缓存重建业务较复杂的key 突然失效了,无数的请求会对数据库带来巨大冲击。
-
常见的两种解决办法
(1)互斥锁
设置互斥锁,只有一个线程可以执行更新缓存的操作,当这个线程没有完成更新缓存的操作时,其他读取缓存的线程都要处于等待状态,这就导致可能线程死锁或者等待时间过长的问题。
(2)逻辑过期
取消设置 key 的 TTL 过期时间,采用逻辑维护 key 的过期时间,这样就不会出现缓存未命中的情况, 当某个线程发现逻辑时间已经过期,他会开启一个新线程去做查询数据库更新缓存的操作,之后将缓存中的旧数据返回,其他线程来查询缓存的时候,如果发现逻辑过期,获取互斥锁失败,就直接返回旧数据,因为同步缓存的操作已经有线程在做了。 -
两种方法优缺点