• 技术文章 >后端开发 >php教程

    linux - 大家对PHP多进程与MySQL的高并发瓶颈是怎么处理的

    2016-06-06 20:49:02原创873

    需求

    引发的问题

    这样就出现了一个问题,就是可能存在多个PHP进程对同一条数据都在做处理,如果用Mysql锁机制可以避免这个问题,但是这样的话,就出现另一个问题,就是MySQL的高并发瓶颈,因为我是多个PHP进程同时在进行,一个进程要等待另一个进程解锁后,才能操作数据库。

    这样我前面所做的分割日志、启动多个进程这些操作就失去意义了,因为我在前面做日志分析时,启的进程再多,运行的再快,到最后全都会卡在高并发操作数据库这个瓶颈上,不知道大家对这类问题是怎么处理的?

    回复内容:

    需求

    引发的问题

    这样就出现了一个问题,就是可能存在多个PHP进程对同一条数据都在做处理,如果用Mysql锁机制可以避免这个问题,但是这样的话,就出现另一个问题,就是MySQL的高并发瓶颈,因为我是多个PHP进程同时在进行,一个进程要等待另一个进程解锁后,才能操作数据库。

    这样我前面所做的分割日志、启动多个进程这些操作就失去意义了,因为我在前面做日志分析时,启的进程再多,运行的再快,到最后全都会卡在高并发操作数据库这个瓶颈上,不知道大家对这类问题是怎么处理的?

    写过类似的东西,像这种需要多次更新同一账号数据的时候,我们的做法是处理完数据后不立即存入mysql,
    而是放在了redis中,后面的数据更新都在redis修改,
    在redis积累了数千条数据后在异步的写一次数据到mysql,效果不错
    卤煮的场景多进程处理建议只负责数据处理,处理完的放redis,在单独用一个脚本定时检测redis
    达到条件的时候(一定条数或时间)存一次数据到mysql

    上面的两种方法都可行

    建主键索引,使用 upsert 语句是最便捷的解决方法。如上 @felix021 大神所言。

    另外,使用缓存(Memcache 或者 redis )异步写入数据也不错,只是开发代价要高一些。

    加队列。做daemon执行队列操作。

    如果只是日志数据的话,题主可以直接用你那个标记记录的唯一表示当做主键|唯一键,直接往数据里面插东西,啥也不用管。
    这样的话既不会锁表也不用去检查这条记录有没有存在。

    1,读加缓存。
    2,写加队列。
    3,推荐Redis。
    4,分库分表分机器。

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php mysql nginx apache linux
    上一篇:windows - PHP未来发展会怎么样? 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • PHP Hyperf 3.0 发布!新功能速览• 详解PHP怎么实现旋转图片验证• 简单理解PHP超级全局变量• 一起聊聊PHP的路由与伪静态应用• PHP中几种常见的开发模式
    1/1

    PHP中文网