求完美的 PHP 并发锁机制

2016-11-23 21:36:10 +08:00
 yangwenqian
要做一个抢红包的功能,环境是使用红包接口, 10 万用户在同 1 秒种进行抢红包的操作,红包只有 10 个,在高并发的情况下,就无法控制了。
一般是先从数据库 count 红包记录,大于 0 个的话,就调用红包接口,然后在数据库写一条记录。
10 万用户在同一毫秒请求,数据库读写间隔时间太长了,导致 count 出来都是 0 ,没法限制 10 个。
请问该怎么锁?
网上有很多锁,试过大部分用 cache 锁或文件锁实现,我试了,在压力测试下,cache读写间隔时间比数据库少很多,但还是有间隔时间,仍然没有办法限制 10 个红包。
求解决办法。谢谢。
11435 次点击
所在节点    PHP
44 条回复
2owe
2016-11-24 21:52:19 +08:00
Redis 双队列,每次抢红包, rpoplpush 原子操作 A POP 、 B PUSH ,执行发红包处理:若有失败, B lRem 、 A lPush ;若成功, B lRem 。


我们是小产品哈,并发其实没很高。
2owe
2016-11-24 21:58:12 +08:00
http://www.woshipm.com/pd/204789.html

当时自己看了这篇文章,感觉帮助挺大的。
fhefh
2017-07-23 21:24:45 +08:00
先 mark 谢谢
nash
2017-12-01 10:46:35 +08:00
nginx 控制请求次数,超过的直接返静态页面,请求通过的统统给我到 REDIS 上面排队,进行二次过滤,这样万无一失了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/322782

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX