我们总有这样赢体验,在线下调试都正常, 怎么上线了。总有这样,或那样的bug。究其原因是环境不同,线上环境比线下环境复杂。 而很多公司往往不重视测试环节或者测试环节时间太少。 导致很多问题在线下环节发现不了。一上线就出了这样或那样的问题。
Bug这个东西从概率来说 ,分三种。 一种是100%出现的,一种是非100%出现的,但还是比较容易出现,还有一种是低概率的。 100%复现的bug,对于程序员来说比较好解决。 剩下两种出现的bug,对没有经验的程序员来说是一个坎。 根据我个人检验, 剩余两个bug出现的原因很大的可能是没有处理好并发。低概率的bug,一般要高并发才有机会出现。 推荐一个工具http_load. 这个工具可以模拟高并发。
什么是并发? 现在的操作系统大多都是多任务操作系统。多任务的意思,在宏观上看就是多个进程同时运行。 从微观上看,每个进程运行一定的时间片,然后就让出CPU. 这里有一个关键,进程将随机的让出CPU.
PHP是一门解析的性的语言。 服务器接受到http的url后,发现是PHP文件就调用PHP解析器,去解析PHP文件。 关键点: PHP解析的过程会被CPU随机打乱,
我们想一下O2O购物中一个经典案例。 购买商品。
1. 前端发送POST/GET请求到后端。
2. 后端从数据库读取商品数量,当前商品数量大于1,客户可以进入支付。
3. 支付完成,当前商品数量减1,写入数据库。
一个购买就完成了。
并发来了:
A用户发起请求,执行到第2步的时候,被中断。
B用户又发起请求,他运气好,直接购买成功,执行完了3步骤
C. 这个时候A用户回来执行第3步骤。 如果商品还有剩余没有问题,关键是如果在A,B抢购的时候只有一个商品呢?B已经购买完成了,A还可以买什么?
如何解决这个问题呢? 其实这个问题很好解决。步骤 1.加一个锁。 当A用户操作商品所在的表时候,B就不能再操作这个表了。2. 使用事务机制。
做一个总结: 并发问题的根本原因是,共享的资源被访问的时候,顺便被随机更改。 这里的共享资源不限于数据库,比如memcached, redis,文件.也是共享资源。
解决方法:
1. 使用锁。 锁的本质含义是我访问这个资源,别的进程只有我使用完了以后才可以用。
2. 使用原子性操作。 Redis的INCR,DECR 据说是原子性的。这个时候就不需要在加锁了。这个可以安全使用。