高并发系统设计40问
唐扬
美图公司技术专家
立即订阅
9202 人已学习
课程目录
已更新 38 讲 / 共 40 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 为什么你要学习高并发系统设计?
免费
基础篇 (6讲)
01 | 高并发系统:它的通用设计方法是什么?
02 | 架构分层:我们为什么一定要这么做?
免费
03 | 系统设计目标(一):如何提升系统性能?
04 | 系统设计目标(二):系统怎样做到高可用?
05 | 系统设计目标(三):如何让系统易于扩展?
06 | 面试现场第一期:当问到组件实现原理时,面试官是在刁难你吗?
演进篇 · 数据库篇 (5讲)
07 | 池化技术:如何减少频繁创建数据库连接的性能损耗?
08 | 数据库优化方案(一):查询请求增加时,如何做主从分离?
09 | 数据库优化方案(二):写入数据量增加时,如何实现分库分表?
10 | 发号器:如何保证分库分表后ID的全局唯一性?
11 | NoSQL:在高并发场景下,数据库和NoSQL如何做到互补?
演进篇 · 缓存篇 (6讲)
12 | 缓存:数据库成为瓶颈后,动态数据的查询要如何加速?
13 | 缓存的使用姿势(一):如何选择缓存的读写策略?
14 | 缓存的使用姿势(二):缓存如何做到高可用?
15 | 缓存的使用姿势(三):缓存穿透了怎么办?
16 | CDN:静态资源如何加速?
加餐 | 数据的迁移应该如何做?
演进篇 · 消息队列篇 (6讲)
17 | 消息队列:秒杀时如何处理每秒上万次的下单请求?
18 | 消息投递:如何保证消息仅仅被消费一次?
19 | 消息队列:如何降低消息队列系统中消息的延迟?
20 | 面试现场第二期:当问到项目经历时,面试官究竟想要了解什么?
用户故事 | 从“心”出发,我还有无数个可能
期中测试 | 10道高并发系统设计题目自测
演进篇 · 分布式服务篇 (9讲)
21 | 系统架构:每秒1万次请求的系统要做服务化拆分吗?
22 | 微服务架构:微服务化后,系统架构要如何改造?
23 | RPC框架:10万QPS下如何实现毫秒级的服务调用?
24 | 注册中心:分布式系统如何寻址?
25 | 分布式Trace:横跨几十个分布式组件的慢请求要如何排查?
26 | 负载均衡:怎样提升系统的横向扩展能力?
27 | API网关:系统的门面要如何做呢?
28 | 多机房部署:跨地域的分布式系统如何做?
29 | Service Mesh:如何屏蔽服务化系统的服务治理细节?
演进篇 · 维护篇 (5讲)
30 | 给系统加上眼睛:服务端监控要怎么做?
31 | 应用性能管理:用户的使用体验应该如何监控?
32 | 压力测试:怎样设计全链路压力测试平台?
33 | 配置管理:成千上万的配置项要如何管理?
34 | 降级熔断:如何屏蔽非核心系统故障的影响?
高并发系统设计40问
登录|注册

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

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

什么是缓存穿透

缓存穿透其实是指从缓存中没有查到数据,而不得不从后端系统(比如数据库)中查询的情况。你可以把数据库比喻为手机,它是经受不了太多的划痕和磕碰的,所以你需要给它贴个膜再套个保护壳,就能对手机起到一定的保护作用了。
不过,少量的缓存穿透不可避免,对系统也是没有损害的,主要有几点原因:
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《高并发系统设计40问》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(34)

  • 公号-代码荣耀 置顶
    很实用,很赞

    作者回复: 谢谢~

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

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

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

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

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

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

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

    作者回复: bloom filter需要自研,可以基于redis持久化存储到硬盘上

    连接池应该解决不了问题,因为链接不是无限的;限流是有损的

    2019-10-21
    1
    3
  • Luciano李鑫
    “即使使用 32 位的 Hash 算法,它的值空间长度是 2 的 32 次幂减一,约等于 42 亿,用来映射 20 亿的用户数据,碰撞几率依然有接近 50%“。这50%的碰撞率是怎么得到的
    2019-11-15
    2
  • 方木木
    “即使使用 32 位的 Hash 算法,它的值空间长度是 2 的 32 次幂减一,约等于 42 亿,用来映射 20 亿的用户数据,碰撞几率依然有接近 50%。”这是怎么算出来的?
    2019-10-27
    2
  • jun.hai
    老师您好,请教个问题,文中讲到的缓存穿透跟缓存雪崩是一个概念么?如果不是那缓存雪崩的解决方案是什么呢?谢谢

    作者回复: 穿透指的是缓存中没有数据,需要到数据库中去取;雪崩指的是一个缓存节点的故障导致全局故障,两者是不同的

    之前提的一致性hash中实现虚拟节点就是一种避免雪崩的方法

    2019-12-03
    1
    1
  • Fourty Seven
    分布式锁的方案中,有问题吧?如果第二个线程发现有这个key说明有别的线程在加载数据,但是还没有加载完,这个时候读缓存是没有的。

    作者回复: 可以返回失败 不从数据库读取,或者重试

    2019-11-12
    1
  • miracle
    如果设置缓存key值不过期,是否可以避免狗桩效应呢?
    想请教下唐老师 什么场景下不适用于设置不过期的情况,一般频繁更新的场景也不适用缓存吧

    作者回复: 一般不建议设置缓存不过期,原因有两方面,一方面是数据可能会有不一致,另一方面缓存的容量也会有限制

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

    作者回复: 是的

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

    作者回复: 是的

    2019-10-22
    1
  • longslee
    打卡。老师你好,请问文中介绍布隆过滤器,提到“使用多个 Hash 算法为元素计算出多个 Hash 值”,这句话怎样理解呢?如果同一个key采用多个Hash算法得出得Hash值基本不一样,那数组下标也不一样,这同一个key对应好几个下标,那跟别的key有大量冲突呀,这时该怎么判断呢。

    作者回复: 比如有三个算法算出三个值,那么必须三个值都一致才算是在集合中,只有两个值一致不算

    2019-10-21
    4
    1
  • 约书亚
    另外,之前研究bloom filter时发现了一种Cuckoo Filter,有更好的表现且支持删除比Countered Bloom Filter更优。但其实现代码还未经过时间考验,也许未来能取代bloom filter
    2019-10-21
    2
    1
  • 小喵喵
    1.这两节都有提到分布式锁,请问下分布式锁和一般锁的有什么区别呢?
    2.缓存适合存放什么样子的数据呢?还是数据库里面的所有数据都可以放入缓存呢?
    谢谢

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

    2019-10-21
    1
    1
  • 良记
    最后这个分布式锁并不是十分理解,如果在数据还没有被缓存到Redis的时候,其他请求查询到了“lock.1”,那么重新取数的时候是等待新数据缓存好了还是说直接拿到空值?

    作者回复: 拿到空值

    2019-10-21
    1
  • 飞翔
    如果布隆过滤器会将集合中的元素判定为不在集合中,那么我们就不们就不确定,被布隆过滤器判定为不在集合中的元素,是不是在集合中。这句话是不是写反了,应该是判定为在集合中,就不能确定到底在不在集合中,因为有hash碰撞的问题

    作者回复: 是的,是集合中的元素不一定在集合中。

    我的这句应该是一个假设,表示,如果布隆过滤器可以把不是集合中的元素判定为在集合中,也就是false negative,那么就不能减少缓存穿透了。正因为布隆过滤器是false positive,所以才可以减少缓存的穿透

    2019-10-21
    1
  • Geek_810a90
    老师,还是有个疑惑 先查布隆过滤器存在,去查缓存,缓存中失效了或者是刚更新过数据删除了缓存,透过缓存查询数据库,在高并发的情况下,也还是会出现缓存穿透的吧

    作者回复: 是的,缓存穿透肯定会有,只是要尽量减少

    2019-12-10
  • 海罗沃德
    如果緩存過期後還沒來得及做cache aside就來了一波爆發流量,那麼那些沒有緩存的數據會不會導致後台數據庫的高併發請求?怎麼能在緩存快過期時候自動續租?

    作者回复: 可以加分布式锁来限制到db的请求

    2019-11-07
  • 星空123
    这篇文章厉害,哈哈。布隆过滤器的优缺点👍
    2019-11-04
收起评论
34
返回
顶部