Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
424 views
in Technique[技术] by (71.8m points)

PHP接口高并发有什么简单的解决思路?

问题描述

目前我们有一个虚拟卡密提取接口,时常会有高并发请求的情况,每个请求进来后,必须马上返回分配的卡密数据,并标记为已提取。

当遇到高并发时候,就会出现同一卡密发给多人的情况。

问题出现的平台版本及自己尝试过哪些方法

查阅资料后,尝试过flock的文件锁,但是并发上来后,CPU马上跑满了,所有请求都堵死了,根本无法执行下去。

考虑如果使用消息队列的话,虽然能马上完成一次请求,避免重复领取,但是实际的出队和数据库的修改操作都是异步执行了,请求结束后,不能马上得到提取结果,一个提取动作只能分成两个步骤去完成了(效率比较低)

你期待的结果是什么?实际看到的错误信息又是什么?

有没有什么办法,能让每次请求都能得到结果,并且避免重复领取(偶尔出现个别重复是可接受的)简单办法?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

利用 Redis 的Queue处理即可

  1. 将卡密数据的 ID同步一份到 Redis
  2. 处理请求时使用LPOP从Redis 获取卡密的 ID,获取失败则证明没卡密了
  3. 获取到卡密 ID 之后正常发号即可。

LPOP是经常用来处理秒杀、抽奖之类场景的


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...