第九日后端青训营 | 青训营笔记

82 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第9天

秒杀项目介绍

该项目模拟了高并发场景的商城系统,它具备用户注册登录,普通商品以及秒杀商品的下单购买功能。为了解决秒杀场景下的高并发问题。该项目使用nginx反向代理以分布式的方式进行云端部署。并采用了多级缓存策略,包括redis缓存,本地热点数据缓存(Guava cache)以及nginx缓存,并使用页面静态化技术将静态资源缓存在CDN中,降低服务器的压力,加快了用户的访问速度。还使用异步消息队列机制对系统的交易性能进行了优化。在秒杀接口使用秒杀令牌来防止脚本对秒杀接口的不断刷新,并使用秒杀大闸以及队列限洪原理进行了流量削峰处理,保证服务器的稳定性。其他接口也设置了接口限流防刷。最后还使用验证码技术不仅起到削峰的作用,还能防止恶意刷访问。最后使用队列泄洪原理去限制了并发流量。

秒杀中如何处理超卖问题?

解决超卖问题:

在数据库减库存时加上库存数量判断,库存数量为0时阻止秒杀订单的生成。

数据库加唯一索引,防止用户重复购买

解决性能问题:

使用Redis缓存预减库存,减少数据库的访问,缓解数据库压力,提升效率。

采用异步消息队列生成订单,增强用户体验。

整体流程

在系统初始化时,将商品的库存数量加载到Redis缓存中;

接收到秒杀请求时,在Redis中进行预减库存,当Redis中的库存不足时,直接返回秒杀失败,否则继续进行第3步;

将请求放入异步消息队列中,返回正在排队中;

服务端异步队列将请求出队,出队成功的请求可以生成秒杀订单,减少数据库库存,返回秒杀订单详情。

用户在客户端申请秒杀请求后,进行轮询,查看是否秒杀成功,秒杀成功则进入秒杀订单详情,否则秒杀失败,将Redis的库存重新加回。

如何防止用户一直点击下单按钮

前端限制: 一次点击之后按钮置灰几秒钟。给按钮设计一个点击时间,用定时器来记时。

后端限制: 每个用户只能获得一个秒杀令牌,然后存入到Redis缓存中。用户的一个下单请求会先判断用户当前是否已经持有令牌了,用户有令牌的话直接返回 “正在抢购中”。

总结

本节课主要针对秒杀项目进行了相关学习,对其有了进一步的理解。