秒杀

限时抢码(秒杀)设计

二次信任 提交于 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是单线程,这样队列出队实际会是串行的操作, 可以避免 超发 和用户 ‍ ‍ ‍ ‍ ‍ ‍ 取到同一个码 ‍ ‍ ‍ ‍ 的问题 ‍ ‍ ,也解决了数据库压力。 总结:只是针对业务方面,实际运用的时候还会做一些负载均衡、限流、防刷的策略。 ‍ ‍ 如果并发太高向数据库添加记录的操作可以异步来进行。 ‍ ‍ 来源: oschina 链接: https://my