秒杀系统

58沈剑《秒杀系统架构优化思路》读后感,秒杀系统设计的核心思想就是:将请求尽量拦截在数据库的上游、充分利用缓存。

前端

  • 利用CDN和浏览器缓存进行一级流量拦截

秒杀前用户不断刷新商品详情页,页面请求达到瞬时高峰,可以将该页面上的元素尽量静态化处理,除了秒杀按钮需要服务端进行动态判断,其他的静态数据可以缓存在浏览器和 CDN 上

  • 通过按钮置灰和js限制访问间隔减少用户提交请求的次数

大部分请求来自于用户狂点按钮,这些请求大部分是无效的,所以尽量拦截在上游,这样能挡住80%的请求。但是这种方式只能拦截普通用户,对于程序员来说,完全可以写脚本循环调用http接口。

服务端

  • 利用本地缓存或者redis缓存限制访问间隔

为了防止程序员写for循环调用接口,可以设置如几秒内只允许访问一次,本地缓存定时失效可以使用环形队列来实现,redis缓存实现更为简单:直接用setnx(不存在时设置缓存)将用户id存到缓存,设置失效时间为n秒,当收到请求时设置成功缓存才让通过。

  • 利用redis缓存来存储库存信息

库存数量放入缓存后,用户请求进来直接decr缓存的库存数量,decr是原子性的,不用担心并发问题。此外可以在本地设置一个标志是否有库存,当缓存中的库存数量变为0后将标志置为false,后面进来的请求直接在这个本地变量这就被拦截了,就不会再去请求redis。此时若预减库存成功可以给用户返回排队中。

  • 利用MQ操作数据库

预减缓存的库存成功后不直接写数据库,而是写入消息队列,数据库订阅消息,去操作减库存、写订单,成功后返回秒杀成功。

数据库层优化

  • 读写分离
  • 分库分表
  • 数据库集群

秒杀系统实现30分钟没付款就自动关闭交易

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值