缓存常见问题
缓存常见问题
1.缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
解决方案:
缓存空对象
- 优点:实现简单,维护方便
- 缺点:
- 额外的内存消耗
- 可能造成短期的不一致
如果使用id为key缓存空对象,那使用
uuid作为id访问,也会造成大量请求打到数据库,短期的不一致是因为,如果访问一个不存在的数据,这时将它存为null,然后数据库将这条数据插入到数据库,别人访问时还是null,
可以在插入时主动更新,但也会有新的问题
布隆过滤
- 优点:内存占用较少,没有多余的key
- 缺点:
- 实现复杂
- 存在误判可能
不存在一定不存在,存在可能存在
只用布隆过滤器的话,也会有一定的穿透可能:布隆判断存在,这时缓存和数据库中数据可能是不存在的,这样也造成了穿透
布隆过滤器不能修改,想修改只能删除,再创一个布隆过滤器
增强id的复杂度,避免被猜测id规律
做好数据的基础格式校验
加强用户权限校验
做好热点参数的限流.。
2.缓存雪崩
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。
解决方案
- 给不同的key的TTL添加随机值
- 利用Redis集群提高服务的可用性
- 给缓存业务添加降级限流策略
- 给业务添加多段缓存
3.缓存击穿
缓存击穿问题也叫热点key问题,就是一个被高并发访问并且缓存重建业务比较复杂的key突然失效了,无效的请求访问会在瞬间给数据库带来巨大的冲击。
缓存重建业务比较复杂是,在缓存未命中,查询数据库,到写入缓存这一阶段,比较复杂,用时比较长,加上它又是一个热点数据,所以会出现击穿问题
解决方案
- 互斥锁
- 缺点:一个线程获取锁后,别的线程会一致等待,用户体验不太好,可以添加一些降级策略
- 一致性较高
- 逻辑过期
- 可用性较高
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Zsh的树洞!


