36 | Redis支撑秒杀场景的关键技术和实践都有哪些?
该思维导图由 AI 生成,仅供参考
秒杀场景的负载特征对支撑系统的要求
- 深入了解
- 翻译
- 解释
- 总结
Redis在秒杀场景中发挥关键作用,满足了高并发和原子性执行的需求。秒杀活动分为秒杀前、秒杀中和秒杀后三个阶段,其中秒杀中阶段对Redis的需求最大。在这个阶段,Redis支持高并发的库存查验和扣减操作,避免了数据库压力过大和超售问题。文章还介绍了Redis切片集群和原子操作、分布式锁等功能特性,以及如何在不同阶段使用Redis来支撑秒杀场景。 在秒杀场景中,Redis的高并发处理能力和高效的键值对读写特性能够满足瞬时高并发请求和读多写少的特点。通过前端CDN和浏览器缓存,可以拦截大量秒杀前的请求。在实际秒杀活动进行时,库存查验和库存扣减是承受巨大并发请求压力的两个操作,同时,这两个操作的执行需要保证原子性。Redis的原子操作、分布式锁这两个功能特性可以有效地来支撑秒杀场景的需求。 除了Redis的支持,秒杀系统还需要处理前端静态页面设计、请求拦截和流控、库存信息过期时间处理以及数据库订单异常处理等环节。对于秒杀场景来说,建议将秒杀商品的库存信息用单独的实例保存,避免干扰业务系统的正常运行。 在使用切片集群时,让每个实例各自维护库存量并分发秒杀请求到不同实例进行处理是一个好方法,可以有效减轻实例的压力。 总的来说,Redis在秒杀场景中发挥着重要作用,通过其高并发处理能力和特性功能,能够有效支撑秒杀活动的需求。
《Redis 核心技术与实战》,新⼈⾸单¥68
全部留言(45)
- 最新
- 精选
- 新世界一般秒杀场景 用redis 扣减库存,不去保证原子性,扣减后有可能超卖,再用数据库去保证最终不超卖,因为超卖的不会多,能够打到mysql的操作就是超卖+实际库存,所以mysql压力也会比较少 课后习题: redis的 800个库存,分布到4个server上,打到哪个server上,取决于key,如果key分布不均匀,会导致 一定的不公平,就像高考一样,有的地方考生多,有的地方考生少,虽然在每个省中录取名额一样,但是也不公平
作者回复: 高考的比喻很形象!
2020-12-07426 - Geek_f6a7c7不是一个好方案,一个商品库存数切片不同实例存储的确可以减少单个实例的压力,但是在业务上可行性有待商榷,如果当前切片实例没有库存,是不是要再请求别的切片实例?特别是库存数都被抢购完成后,后面的请求是不是都要请求4个切片节点做库存数的聚合才知道又没人退货,做库存数的聚合?
作者回复: 分析的不错。使用切片后,处理逻辑要考虑分布式的数据情况了,变得复杂了。
2020-12-04216 - 花轮君设计上是可行的,将秒杀请求也进行分片,库存的校验可以按照分库顺序扣。
作者回复: 请求分片的均衡度会比较难控制,另外,如果按照分库顺序扣的话,那么设计四个分片期望达到的支持并发扣减库存的目标就达不到了。
2020-11-1329 - 曾轼麟我个人认为这个方式不是很好,因为单个sku分开后,需要对用户的请求做路由判断,假如一个用户请求本身就发出了两条,按照随机路由的方式,他有可能在两个切片中抢到商品。假如路由规则是固定的,那么会出现sku还有库存,但是用户就是抢不到的情况
作者回复: 这里的关键技术挑战就是:请求分发规则和库存分布式查询。
2020-11-205 - 范闲如果秒杀请求能够比较均匀的分别打到4个实例上是没有问题的。 这个时候不返回剩余库存,不做聚合,能大幅度提高速度。
作者回复: 关键是这个假设不一定能实际做到。。。
2020-12-0323 - yyl将800个商品均分至4个实例,并不能保证客户端请求被均分至不同的实例;毕竟用户的行为是无法预测的,有可能出现某个实例的请求量比较大
作者回复: 这是个关键因素。 而且如果某个实例上的库存扣除完了,并不代表所有库存都扣完了,这时要想判断是否还有库存,就要去其他实例查询,逻辑就复杂了。
2020-11-22 - @%初%@我觉得,是可行的,主要要考虑最后的余量怎么处理,0~2个分片上有余量,而3号分片上有余量,这样怎么处理,还有,就是最后的用余量足够,而每个分片的余量不够,这个又怎么去处理,我觉得这些处理好了,分片存储可以考虑使用。
作者回复: 这种情况下余量查询的逻辑就比较复杂了,会增加查询请求的分发复杂度,反而可能会得不偿失。
2020-11-16 - tt每个实例200个库存,当某个请求在某个实例上查询不到库存时,并不是库存真的为0了,还需要去其它实例查询,这个是一个缺点。 好处时可以承受更大的流量。
作者回复: 查询逻辑会变得比较复杂了。
2020-11-13 - Kaito使用多个实例的切片集群来分担秒杀请求,是否是一个好方法? 使用切片集群分担秒杀请求,可以降低每个实例的请求压力,前提是秒杀请求可以平均打到每个实例上,否则会出现秒杀请求倾斜的情况,反而会增加某个实例的压力,而且会导致商品没有全部卖出的情况。 但用切片集群分别存储库存信息,缺点是如果需要向用户展示剩余库存,要分别查询多个切片,最后聚合结果后返回给客户端。这种情况下,建议不展示剩余库存信息,直接针对秒杀请求返回是否秒杀成功即可。 秒杀系统最重要的是,把大部分请求拦截在最前面,只让很少请求能够真正进入到后端系统,降低后端服务的压力,常见的方案包括:页面静态化(推送到CDN)、网关恶意请求拦截、请求分段放行、缓存校验和扣减库存、消息队列处理订单。 另外,为了不影响其他业务系统,秒杀系统最好和业务系统隔离,主要包括应用隔离、部署隔离、数据存储隔离。2020-11-1322210
- Dovelol老师好,想问下,用redis扣库存直接用HINCRBY已秒杀库存量,判断返回值>=总库存就是没库存,小于总库存就是扣减库存成功可以购买,这样判断有什么问题么?为什么要引入lua脚本来增加复杂度呢?2020-11-143722