Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

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

使用 redis 处理高并发原理??

假设一个抢购系统,每天 16:16:0016:17:001分钟每10s 放出一个产品进行抢购,中奖用户的计算是 单次每轮(每 10 s内),第一个点击 我要抢购 按钮的人为中奖用户。

情况是:在短暂的 10s 内假设有 5千万个用户 参与了,且在 短短的 第1s内 ,集中了 4千万个用户 点击了 我要抢购按钮

由于 php 只能够精确到 us(微妙,microtime 函数可获取),1s = 100 0000us ,而在短暂的 1s 内却集中了 4千万个用户同时点击我要抢购按钮

于是,并发问题就来了。

总会发生在 1us内有多个用户同时点击我要抢购按钮,于是这轮抢购结束后,统计结果,就会出现错误的现象:一轮抢购居然有多个人同时中奖了!

所以,我一开始还打算用 microtime() 来解决并发问题,但是如果出现了我上面描述的情况时,先不论数据库能不能再短时间内承受住如此大量的插入操作,即使承受住了,程序也照样会出错!

我听说 redis 是解决并发的良药,不知道他解决这种问题的原理是什么??


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

1 Reply

0 votes
by (71.8m points)

题主总是过于纠结 “时间精确度”,这个是没有意义而且是错误的用词。

php单机实测理想情况下每秒能处理1000个请求/每秒左右。题主架设的40000000/1000=40000台php服务器做负载均衡才能实现。这时候nginx将成为瓶颈,将需要基于TCP负载均衡的路由将请求发送到多个nginx负载均衡器。

我们看看题主真正的问题。

我们假设服务器的处理速度是100并发每秒。而现在有一个商品,在某一秒开启抢购。有2个用户参与抢购,按照题主的理解,这就可以直接无压力搞定了。

但是实际上并不是,哪怕只是两个用户抢购一个商品。甚至一个用户抢购一个商品,也要需要借助数据库并发锁实现防止重复读取数据。

所以,抢购程序的开发,关键在于,而不是并发数,或者“时间精确度”


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...