高并发系统设计 40 问
唐扬
美图公司技术专家
49013 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
高并发系统设计 40 问
15
15
1.0x
00:00/00:00
登录|注册

15 | 缓存的使用姿势(三):缓存穿透了怎么办?

选择多个Hash函数计算多个Hash值
不支持删除元素
误判情况
更新布隆过滤器数组
初始化大数组
判断元素是否在集合中
可能浪费缓存空间
设置较短的过期时间
向缓存回种空值
查询数据库异常或空值
减少对数据库的并发请求
使用分布式锁
启动后台线程加载数据
建议
缺陷
解决缓存穿透
布隆过滤器算法
注意事项
流程
场景
大量穿透请求导致后端系统崩溃
数据访问遵循“80/20原则”
缓存容量有限
核心目标
解决狗桩效应
回种空值和布隆过滤器
控制并发
使用布隆过滤器
回种空值
有害情况
产生原因
缓存未查到数据,需从后端系统查询
课程小结
解决狗桩效应
缓存穿透的解决方案
什么是缓存穿透
缓存的使用姿势(三):缓存穿透了怎么办?

该思维导图由 AI 生成,仅供参考

你好,我是唐扬。
我用三节课的时间带你深入了解了缓存,你应该知道对于缓存来说命中率是它的生命线。
在低缓存命中率的系统中,大量查询商品信息的请求会穿透缓存到数据库,因为数据库对于并发的承受能力是比较脆弱的。一旦数据库承受不了用户大量刷新商品页面、定向搜索衣服信息,查询就会变慢,大量的请求也会阻塞在数据库查询上,造成应用服务器的连接和线程资源被占满,最终导致你的电商系统崩溃。
一般来说,我们的核心缓存的命中率要保持在 99% 以上,非核心缓存的命中率也要尽量保证在 90%,如果低于这个标准你可能就需要优化缓存的使用方式了。
既然缓存的穿透会带来如此大的影响,那么我们该如何减少它的发生呢?本节课我就带你全面探知面对缓存穿透时,我们到底有哪些应对措施。不过在此之前你需要了解“到底什么是缓存穿透”,只有这样才能更好地考虑如何设计方案解决它。

什么是缓存穿透

缓存穿透其实是指从缓存中没有查到数据,而不得不从后端系统(比如数据库)中查询的情况。你可以把数据库比喻为手机,它是经受不了太多的划痕和磕碰的,所以你需要贴个膜再套个保护壳,就能对手机起到一定的保护作用了。
不过少量的缓存穿透不可避免,对系统也是没有损害的,主要有几点原因:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了缓存穿透问题及解决方案,重点介绍了使用布隆过滤器来解决缓存穿透的方法。布隆过滤器是一种高效的数据结构,通过Hash算法和二进制数组实现对元素是否在集合中的判断。虽然存在误判和不支持删除元素的缺陷,但在缓存穿透问题上仍然具有重要价值。文章还提出了在处理热点缓存失效时的解决方案,包括启动后台线程和使用分布式锁。总的来说,本文通过深入的技术分析和解决方案探讨,为读者提供了对缓存穿透问题的全面理解和解决思路。 在解决缓存穿透问题时,本文提出了几种方案。首先是回种空值,这是一种简单且常见的解决思路,适用于空值缓存占据的空间可以接受的情况。其次是布隆过滤器,虽然引入了新的组件和一些复杂度,但在海量查询数据库中不存在数据的请求时具有重要价值。此外,针对极热点缓存数据穿透造成的“狗桩效应”,可以通过设置分布式锁或后台线程定时加载的方式来解决。最重要的是,要意识到数据库在扩展性、性能和并发能力上的劣势,因此核心目标在于减少对数据库的并发请求。 总的来说,本文为读者提供了全面的解决缓存穿透问题的思路和方法,同时也鼓励读者在日常工作中寻找更好的解决方案。通过深入的技术分析和解决方案探讨,本文为读者提供了对缓存穿透问题的全面理解和解决思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统设计 40 问》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(76)

  • 最新
  • 精选
  • 小虎
    置顶
    讲的很好,很透彻,实用。老师,那么这个过滤器在微服务环境下如何部署比较好?部署好了以后是否也可以起到防止洪水攻击带来的缓存穿透问题?

    作者回复: 以单独服务部署比较好,我之前团队曾经改了一下redis源码来实现这个功能,利用redis的存储机制

    2019-10-24
    3
    17
  • 公号-技术夜未眠
    置顶
    很实用,很赞

    作者回复: 谢谢~

    2019-10-21
    4
    30
  • jc9090kkk
    布隆过滤器可以用在一些资讯app的新闻展示中,给用户推送新的资讯用来过滤掉那些用户已经浏览过的记录

    作者回复: 是的

    2019-10-22
    4
    35
  • 长期规划
    老师,为什么会出现大量查询未注册用户的情况呢?是系统被攻击了?

    作者回复: 可能存在扫描你的用户的爬虫请求

    2019-10-26
    29
  • QQ怪
    老师如何来监控缓存的命中率。

    作者回复: 一般缓存会有cache miss和cache hit的统计信息,也可以自己打印日志统计

    2019-10-21
    24
  • jun.hai
    老师您好,请教个问题,文中讲到的缓存穿透跟缓存雪崩是一个概念么?如果不是那缓存雪崩的解决方案是什么呢?谢谢

    作者回复: 穿透指的是缓存中没有数据,需要到数据库中去取;雪崩指的是一个缓存节点的故障导致全局故障,两者是不同的 之前提的一致性hash中实现虚拟节点就是一种避免雪崩的方法

    2019-12-03
    7
    19
  • 小喵喵
    1.这两节都有提到分布式锁,请问下分布式锁和一般锁的有什么区别呢? 2.缓存适合存放什么样子的数据呢?还是数据库里面的所有数据都可以放入缓存呢? 谢谢

    作者回复: 1. 一般的锁是进程中的锁,可以同步一个进程中的多个线程;分布式锁可以同步多个进程 2. 缓存适合放经常访问的热数据,不能放全量数据,而且也放不下

    2019-10-21
    2
    17
  • 约书亚
    bloom filter这个用法会在各种文章教程中提出,但我一直有个疑问想求教一下:基于redis这种存储的bloom filter有没有成熟的方案?因为我觉得毕竟redis不是一种完全可靠的存储,一旦crash理论上有可能丢数据,在用户的那个案例中,一旦应该出现在bloom filter中的数据丢失了,就意味着永远也查不出这个用户来了。那是否我们还应该启动一个监控进程,一旦发现redis crash了,要重新构建bloom filter呢? 回到思考题,我现在觉得文章中的三个方案都只能解决部分场景的问题,有时候需要配合使用。除此之外,合理的数据库连接池大小以及服务限流也能起到最后防线的作用吧?

    作者回复: bloom filter需要自研,可以基于redis持久化存储到硬盘上 连接池应该解决不了问题,因为链接不是无限的;限流是有损的

    2019-10-21
    5
    9
  • 楼下小黑哥
    布隆过滤器单独部署服务,服务启动时需要初始化数据,将数据库中数据初始化到过滤器中。后续将布隆过滤器定期写到磁盘中,防止服务重启导致丢失。 请教下老师,文中说的布隆过滤器是否如上上面说部署?

    作者回复: 是的

    2019-10-23
    8
  • longslee
    对不起老师给您丢脸了,有面试官问到如何避免缓存穿透,我一下懵了,因为我觉得缓存是可以穿透的,结果他意思应该跟您这一节课差不多,我竟然没想起布隆过滤器。

    作者回复: 没关系,再反复看看专栏的内容,里边都是我多年工作的经验总结,覆盖面还是比较大的……预祝下次面试好运🍀

    2020-07-13
    5
收起评论
显示
设置
留言
76
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部