08 | 答疑解惑:缓存失效的策略应该怎么定?
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了设计秒杀系统的关键技术点,作者首先强调了在服务端采用排队策略以及通过Hash分组来限制热点请求对服务器资源的占用。此外,作者还解答了关于异步请求返回结果的问题,并提出了轮询和主动push两种方式。在动静分离中,文章介绍了Hash分组问题以及如何保证数据一致性。最后,讨论了Cache失效的问题,包括被动失效和主动失效两种方式。总的来说,本文全面覆盖了秒杀系统设计中的关键技术点,为读者提供了深入了解秒杀系统架构的指导。
《如何设计一个秒杀系统》
全部留言(45)
- 最新
- 精选
- 我来也还有加餐,厉害了👍
作者回复: 😉
2018-11-147 - 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-0334 - 古夜第一个问题:同一个商品比如苹果,多个这种苹果的ID是否相同? 二:这个其实很好理解,Cache 实例越多,那么这些 Cache 缓存数据需要访问的次数也就越多。例如我有 3 个 Redis 实例,需要 3 个 Redis 实例都缓存商品 A,那么至少需要访问 3 次才行,而且是这 3 次访问刚好落到不同的 Redis 实例中。那么从第 4 次访问开始才会被命中,如果仅仅是一个 Redis 实例,那么第二次访问时其实就能命中了。所以理论上 Cache 实例多会影响命中率。 这块没明白,希望老师再详细讲讲
作者回复: 第一个问题没明白你要问什么? 第二个问题:我已经解释的这么详细了,不知道还怎么解释😂!!所谓命中就是在没有提前填充缓存的情况下,必须要访问一次cache这个商品才会被缓存起来,这样第二次再访问时cache才会被命中。
2019-01-0744 - 耶愿许老师,问个问题,关于并发写的问题,目前我知道MySQL和redis并发写即使做过优化,tps也就是上千。而淘宝的写入tps至少上万,想知道淘宝是怎么做到上万写入tps的,而用户没有等待的感觉,非常感谢!虽然其它同学有留言,但感觉他们的方法都是过家家的方法,我想知道淘宝这是怎么实现的。
作者回复: 不知道你说的tps先·并发写上千是什么场景下得出的,就我了解即使是MySQL没经过单机写肯定也不止上千QPS。阿里在数据库存的并发写肯定是做了很多的优化,我建议可以订阅一下隔壁的MySQL课程。另外我们说的并发写是有纬度概念的,比如单机还是单库还是单表,还是指一个业务在同一时刻的并发,都不一样。比如阿里的双十一并发下单支持10w的QPS,虽然是的10w但是落到实际的数据库层多个库的多台机器上,因为我们可以根据用户请求的商品ID进行分库分表,这样可以大大减少并发度。
2018-12-204 - Adam解析binlog的中间件是什么?有开源的产品么? 不然自己实现的话代价就比较大了
作者回复: Canal可以去了解一下
2018-11-284 - oTo123老师,请问一下,一个其他问题。商品详情页这种页面,有商品数据,商家数据,评价数据,商品推荐等。这些是放到一个接口返回呢(这样接口那耦合了多个模块的数据),还是每个部分都开一个接口给前端调用(这样减少了网络开销次数)? 在性能需求下怎么权衡呢?
作者回复: 如你所说这是个平衡的问题,没有标准答案,是合并还是分开要具体根据测试结果来判断。就根据经验来判断,像一些评价和推荐数据一般都是单独请求比较好,一个是这些数据比较多,而且服务端也比较耗时所以单独请求会比较合理一些
2019-01-183 - IT小菜鸟许神,打扰您一下,您抽空帮我看一下这个问题,就是我现在项目中的用的spring版本是3.2.0 的,我现在要用spring-session实现session共享,我看网上都是要求spring版本4.x以上,我在本地试了一下,发现session是能存到redis里的,但是我把项目部署到服务器上的时候却存不到redis里,不知道是什么原因,还望许神有空帮忙分析一下哈
作者回复: 找你身边的同学帮你看看吧>o<
2018-12-0643 - 小谢同学失效中心可以直接调用cdn的接口服务吧
作者回复: 嗯
2019-04-112 - tony针对Cache和DB的数据一致性问题,如果DB是A团队业务使用的,Cache是B团队业务使用。DB对于B团队来说不可控,可以通过什么方式对A提出较少的需求(比如是要在DB所在机器安装监控binlog的中间件吗?比如要求A团队打开DB的binlog?),实现读取Cache和A业务的DB数据一致性。
作者回复: 你说的场景是一种实现思路,当然也可以直接通过应用程序直接操作db和cache保持一致性
2018-12-012 - 北极的大企鹅比较想问的是学完框架后,是先学设计模式还是先学JVM原理,并发与线程安全,然后中间件和架构设计,数据库设计,Linux学习,跨语言学习顺序,这些都是按照什么样的顺序学习的,还有源码阅读顺序
作者回复: 这个没有统一的答案😀
2019-04-1151