php如何解决高并发下的全局累计计数问题?
有这样一个需求,有一个高并发的网站,网站想拦截来自浏览器的请求,记录每个请求的某些信息并写入文件(不是写入数据库,如果写入数据库的话直接通过ID递增就可以实现了,事实上并不是),对于每个请求都要有一个编号。编号从0000~9999循环,因为网站载流量大的情况下会出现高并发的问题,我应该采取什么方式来记录这个编号?
想过这些方案
使用全局变量,感觉有点危险,而且不稳定。
采用数据库来计数,可以实现数字的累加,当然要对数据库加事务锁,不加的话会出现死锁,但是这样在高并发的状态下,就会使数据库的压力变的很大,会造成响应延迟,甚至崩溃
采用文件来记录数字,这个和上面的数据库记录的方式大同小异,存在同样的问题
引入redis来记录,redis缓存技术中变量的递增是原子操作,可以实现数字的累加,不会出现死锁,而且速度很快,按理说是最好的办法,但是目前在使用redis方面遇到了一点问题
所以在这里想请教一下大家,对于高并发网站的全局数字累计记录,大家有什么更好的方案?
回复内容:
有这样一个需求,有一个高并发的网站,网站想拦截来自浏览器的请求,记录每个请求的某些信息并写入文件(不是写入数据库,如果写入数据库的话直接通过ID递增就可以实现了,事实上并不是),对于每个请求都要有一个编号。编号从0000~9999循环,因为网站载流量大的情况下会出现高并发的问题,我应该采取什么方式来记录这个编号?
想过这些方案
使用全局变量,感觉有点危险,而且不稳定。
采用数据库来计数,可以实现数字的累加,当然要对数据库加事务锁,不加的话会出现死锁,但是这样在高并发的状态下,就会使数据库的压力变的很大,会造成响应延迟,甚至崩溃
采用文件来记录数字,这个和上面的数据库记录的方式大同小异,存在同样的问题
引入redis来记录,redis缓存技术中变量的递增是原子操作,可以实现数字的累加,不会出现死锁,而且速度很快,按理说是最好的办法,但是目前在使用redis方面遇到了一点问题
所以在这里想请教一下大家,对于高并发网站的全局数字累计记录,大家有什么更好的方案?
内存性数据库,诸如redis,memcache也行,是最好的选择也是最快的首选的选择,不清楚楼主遇到了什么技术问题
毫无疑问,纯php解决不了这个问题的,引入swoole扩展吧,使用swoole的atomic类,可以是实现多进程原子无锁累加计数
自己开发...
每个请求都要有一个编号。
编号从0000~9999循环 必须么,不必须的话,建议用 uuid
上一篇: exec(),passthru()
下一篇: PHP5 OOP编程之代理与定制异常