限时抢码(秒杀)设计

二次信任 提交于 2019-11-26 19:41:02

做之前看了不少关于秒杀商品的文章,其中有一篇觉得很好:【问底】徐汉彬:Web系统大规模并发——电商秒杀与抢购

抢码的逻辑比秒杀商品要简单太多,虽然简单但是高并发的问题却还是存在的,有几个问题:

  • 如何保证不超发。

  • 如何防止重复领取。

  • 如何防止用户领取到同一个码。

直接操作数据库的做法:

    先查询status为0的纪录,再更新:select id from codes where status = 0 limit 1;update codes set status = 1 where id = xxx and status = 0;

上面的做法在高并发下会出现什么问题呢?

  • 造成多个用户查询到同一个码。

  • update的时候会扫描全表。

  • 开启事务时先select后update可能会造成死锁。

我的想法是加入Redis来提高高并发时的性能:


  • 事先把码放入redis队列中

  • 满足条件pop一个码出来

为什么使用redis队列?redis是单线程,这样队列出队实际会是串行的操作,可以避免超发和用户取到同一个码的问题,也解决了数据库压力。

总结:只是针对业务方面,实际运用的时候还会做一些负载均衡、限流、防刷的策略。如果并发太高向数据库添加记录的操作可以异步来进行。



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!