如何设计一个秒杀系统
许令波
前阿里巴巴高级技术专家
立即订阅
23218 人已学习
课程目录
已完结 9 讲
开篇词 | 秒杀系统架构设计都有哪些关键点?
免费
01 | 设计秒杀系统时应该注意的5个架构原则
02 | 如何才能做好动静分离?有哪些方案可选?
03 | 二八原则:有针对性地处理好系统的“热点数据”
04 | 流量削峰这事应该怎么做?
05 | 影响性能的因素有哪些?又该如何提高系统的性能?
06 | 秒杀系统“减库存”设计的核心逻辑
07 | 准备Plan B:如何设计兜底方案?
08 | 答疑解惑:缓存失效的策略应该怎么定?
如何设计一个秒杀系统
登录|注册

08 | 答疑解惑:缓存失效的策略应该怎么定?

许令波 2018-11-14
十一黄金周的时候,极客时间团队邀请到了前阿里巴巴高级技术专家许令波专门撰写了《如何设计一个秒杀系统》专栏,希望带你透彻理解秒杀系统的各个关键技术点,并借助“秒杀”这个互联网高并发场景中的典型代表,带你了解如何打造一个超大流量并发读写、高性能,以及高可用的系统架构。
专栏虽然只有短短 7 篇,但却持续获得大量用户的支持和赞誉。留言区,我们更是可以看到大量从学习角度或业务角度出发提出的各种问题。为此,我们也特别邀请专栏作者许令波就一些关键或普遍的问题进一步“加餐”解答,希望能够给你更好的帮助。
1. “06 | 秒杀系统‘减库存’设计的核心逻辑”一文中,很多用户比较关注应用层排队的问题,大家主要的疑问就是应用层用队列接受请求,然后结果怎么返回的问题。
其实我这里所说的排队,更多地是说在服务端的服务调用之间采用排队的策略。例如,秒杀需要调用商品服务、调用价格优惠服务或者是创建订单服务,由于调用这些服务出现性能瓶颈,或者由于热点请求过于集中导致远程调用的连接数都被热点请求占据,那么那些正常的商品请求(非秒杀商品)就得不到服务器的资源了,这样对整个网站来说是不公平的。
再比如说,正常整个网站上每秒只有几万个请求,这几万个请求可能是非常分散的,那么假如现在有一个秒杀商品,这个秒杀商品带来的瞬间请求一下子就打满了我们的服务器资源,这样就会导致那些正常的几万个请求得不到正常的服务,这个情况对系统来说是绝对不合理的,也是应该避免的。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《如何设计一个秒杀系统》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(28)

  • 张雨桐老豆
    这方面的东西看了很多,但是,大多数程序员是接触不到或者这方面的知识让你去搭建设计一个这样的系统,一方面公司没有这么大的流量,除了一些bat公司.另一方面,就算有这个留了,一般的系统都是现成的.一个100人的团队,也许就那么一两个人负责,大多数还是在硬编码,所以说大多数的程序员都停留在一个理论阶段,很少有实践的地方
    2018-12-06
    1
    55
  • 小胡子
    看来看去 没有看出个所以然 看来还是我道行不够
    2019-01-08
    1
    8
  • 我来也
    还有加餐,厉害了👍

    作者回复: 😉

    2018-11-14
    5
  • 古夜
    第一个问题:同一个商品比如苹果,多个这种苹果的ID是否相同?

    二:这个其实很好理解,Cache 实例越多,那么这些 Cache 缓存数据需要访问的次数也就越多。例如我有 3 个 Redis 实例,需要 3 个 Redis 实例都缓存商品 A,那么至少需要访问 3 次才行,而且是这 3 次访问刚好落到不同的 Redis 实例中。那么从第 4 次访问开始才会被命中,如果仅仅是一个 Redis 实例,那么第二次访问时其实就能命中了。所以理论上 Cache 实例多会影响命中率。
    这块没明白,希望老师再详细讲讲

    作者回复: 第一个问题没明白你要问什么?
    第二个问题:我已经解释的这么详细了,不知道还怎么解释😂!!所谓命中就是在没有提前填充缓存的情况下,必须要访问一次cache这个商品才会被缓存起来,这样第二次再访问时cache才会被命中。

    2019-01-07
    4
  • Do
    你好,分组是为避免热点,这是ok的,我所说的空间浪费3倍不是指分组的浪费,我指的是组内的机器。如你的例子,一个组里面有3个varsion实例,那么假设这3个varsion实例的内存是1GB,那么其实这3个varsion实例也就只能提供1GB的的缓存。假如这个组命名为A组,分别给组内varsion实例分别命名为A1,A2A3,假设每组的热点数据是2GB,那么是否有以下几个缺陷
    1:缓存不一致,会导致一台实例请求过的还需要在回源。例如有个商品A的请求,被路由到A组,那么第一次随机到A1,此时A1需要回源然后存储,那么假设下次同下是商品A的请求,还是被路由到A组,但是这次被路由到A2,此时因为A2没请求过所以还是需要回源请求下。也就是组内各个varnish的缓存数据不一致会导致不必要的请求回源;
    2:集群数据扩容代价大。例如现在集权每台varnish实例是1GB内存进行HTTP缓存,然后为了提高HTTP缓存命中率,将varnish实例内存提高到2GB,尽可能的将热点数据在每个varnish实例间缓存,那么以你集群所示,一个组3台机器,由于varnish实例间不共享内存数据,所以为了能尽可能的缓存,每台机器都需要扩容到2G,也就是一共是增加了3GB内存,但是只提高了1GB的缓存增加;
     您留言说的Nginx增加热点模块,也有上述缺陷吧
    我的问题是:
    1.关于我所说的第一点,是否可以让商品请求在组内时,使用一致性HASH算法路由到varnish实例上而不是随机访问组内varnish实例;
    2.关于第二点,有什么好的方式解决吗

    作者回复: 你没理解我的意思,建议你仔细看看我说的话,一个组内的三台实例,同一份商品数据只会存一份。

    一个商品是随机路由到3个分组的,但是一个商品始终只会命中一个分组中的一个实例

    2019-02-03
    1
    2
  • IT小菜鸟
    许神,打扰您一下,您抽空帮我看一下这个问题,就是我现在项目中的用的spring版本是3.2.0 的,我现在要用spring-session实现session共享,我看网上都是要求spring版本4.x以上,我在本地试了一下,发现session是能存到redis里的,但是我把项目部署到服务器上的时候却存不到redis里,不知道是什么原因,还望许神有空帮忙分析一下哈

    作者回复: 找你身边的同学帮你看看吧>o<

    2018-12-06
    1
    2
  • maomaostyle
    失效中心可以直接调用cdn的接口服务吧

    作者回复: 嗯

    2019-04-11
    1
  • 耶愿
    许老师,问个问题,关于并发写的问题,目前我知道MySQL和redis并发写即使做过优化,tps也就是上千。而淘宝的写入tps至少上万,想知道淘宝是怎么做到上万写入tps的,而用户没有等待的感觉,非常感谢!虽然其它同学有留言,但感觉他们的方法都是过家家的方法,我想知道淘宝这是怎么实现的。

    作者回复: 不知道你说的tps先·并发写上千是什么场景下得出的,就我了解即使是MySQL没经过单机写肯定也不止上千QPS。阿里在数据库存的并发写肯定是做了很多的优化,我建议可以订阅一下隔壁的MySQL课程。另外我们说的并发写是有纬度概念的,比如单机还是单库还是单表,还是指一个业务在同一时刻的并发,都不一样。比如阿里的双十一并发下单支持10w的QPS,虽然是的10w但是落到实际的数据库层多个库的多台机器上,因为我们可以根据用户请求的商品ID进行分库分表,这样可以大大减少并发度。

    2018-12-20
    1
  • 感谢老师的分享,即使不做架构师,对以后写代码的思路也有很大的提升!
    2018-12-11
    1
  • Adam
    解析binlog的中间件是什么?有开源的产品么? 不然自己实现的话代价就比较大了

    作者回复: Canal可以去了解一下

    2018-11-28
    1
  • William
    老师您好.我有个这样的问题(与咱们这个秒杀无关).

    就是网站的首页, 要展示很多的信息(多数是统计信息),一共大约查询了7个接口. 而这些接口的数据,一般的都是实时产生的, 我如何去优化这些呢?

    目前能想到的是加入缓存 redis 数据产生变化的时候,调用redis修改缓存数据 , 但是这些数据的产生来源于各种不同的节点, 改造点太多了....

    有木有什么好的建议?
    2019-11-15
    2
  • superfq
    老师,您好,请教两个问题
    1. cache失效期间一致性的问题:从mysql数据更改后,到失效中心通知cache失效,这期间的请求仍然会读到老的cache,出现读写不一致的情况,比如线程A提交数据库把数据从1改成2,线程B马上从cache中读这个数据可能读到的还是1,只后具体1做写操作,就出现了不一致,请问这种情况如何处理?
    2. 老师在文中提到了cache分组,失效中心如何有效保证cache中每个cache都失效,如果出现部分cache没有被失效,如何处理?
    谢谢
    2019-11-02
  • 王丰
    面试必问题
    2019-10-25
  • 傻不拉几二锅头
    主动失效:监控binlog 从而去动态变更cache中的配置
    2019-09-26
  • 陈榕
    许哥,请问一下,阿里秒杀单机的QPS,多少台机器呢,大概是多少呢,最近要做一个分享,麻烦您告知一下
    2019-08-26
  • 吃了没文化的亏
    看完 估计也难有机会实践
    2019-08-15
  • Do
    许老师你好,我对问题一种进行分组的实现还是不太理解,或者目前哪些服务中间件实现了这个分组的逻辑?我自己看下也行。
    2019-06-19
  • 北极的大企鹅
    比较想问的是学完框架后,是先学设计模式还是先学JVM原理,并发与线程安全,然后中间件和架构设计,数据库设计,Linux学习,跨语言学习顺序,这些都是按照什么样的顺序学习的,还有源码阅读顺序

    作者回复: 这个没有统一的答案😀

    2019-04-11
    3
  • du
    所以需要采用一个分组中有多个实例缓存相同的数据(冗余)的办法来支撑更大的访问量。
    ………

    作者回复: 😉

    2019-03-04
  • 晓洁
    什么时候上新呢?

    作者回复: 你还想看哪些方面的?😊

    2019-02-20
收起评论
28
返回
顶部