七月 05, 2019

学习计划

最近看到了许多需要学习的东西,记录一下,防止真的需要用到的时候全都不记得了,其中涉及到一些知识的准确性如果有误,大家自行google,欢迎指正,本人初窥门径,不想误人子弟,只是想给自己一片空间。

高并发处理

1.原子操作是并发处理的有效手段,有很多东西本身就是原子的,比如说数据库,但是如果并发请求的话,比如提交订单,那么对于数据库来讲就只是插入一条记录而已,请求几次就插入几条,这样如果提交订单不是原子的,那数据库是原子的意义也就不大了,这里简单提示下,如果是付费订单,那么即使是同一笔订单,那么可以成功提交1+次,问题也是很严重的;据我所知redis是有原子操作的,但是redis是用来做缓存的,如果出现并发量超过的缓存,那么redis中存储的正常数据,比如验证码,就会被覆盖掉,导致redis瘫痪,所以虽然我的启蒙者告诉我,redis有原子操作,但是我不建议使用redis的原子操作。

2.使用队列处理请求,队列也分几种,譬如redis队列(OB:当然我现在也只知道redis队列),队列的特点就是先进先出,保证并发请求的时候仍然串行处理,但是这样就会出现两个问题,第一个问题就是上面所说的redis问题,另外一个问题就是如果把并行改为串行,那么性能上就会损失很多,因为本来并行的时候可以同时处理10个请求,改成串行了就只能一个一个处理,对性能的影响是很大的,所以我觉得可以开多个线程去处理,比如golang的groutine,但是这种并行改串行然后又开线程的方式我不知道是否存在并发问题,具体的细节还需要去考虑验证。

内存泄露

首先内存为什么会泄露,内存泄露的原因无非就是内存溢出,比如PHP的运行内存默认是32M,假设去数据库查询数据1条记录是1K,那么查100W条数据就是100WK也就是100W/1024,再把这些数据储存到一个变量中,想都不用想肯定是超过32M了,这个时候要尽可能的select少的字段,不需要的字段不要去查询,当然这并解决不了这个问题,真正的方法是众所周知的分页,我一次只拿10条或者100条,来避免内存泄露的问题。

后续学习

最后附上一张图,这是大佬传授的经验。
image