php并发处理

解决并发问题就必须要加锁,各种方案的本质都是加锁

PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制。

 方案一:使用文件锁排它锁
               flock函数用于获取文件的锁,这个锁同时只能被一个线程获取到,其它没有获取到锁的线程要么阻塞,要么获取失败
               在获取到锁的时候,先查询库存,如果库存大于0,则进行下订单操作,减库存,然后释放锁。

 方案二:使用Mysql数据库提供的悲观锁
                Innodb存储引擎支持行级锁,当某行数据被锁定时,其他进程不能对这行数据进行操作。

             悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进               行业务操作。

             通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用                的select … for update操作来实现悲观锁。

              当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select for update如果试图选中                同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自                 动释放,因此必须在事务中使用。
 方案三:使用队列
               将用户的下单请求依次存入一个队列中,后台用一个单独的进程处理队列中的下单请求
 方案四:使用Redis
             redis的操作都是原子性的,可以将商品的库存存入redis中,下单之前对库存进行decr操作,如果返回的值大于等于0等可               以下单,否则不能下单,这种方式效率较高。

              redis真的是一个很好的技术,它可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动。。。
              redis之所以能解决高并发的原因是它可以直接访问内存,下面用redis解决瞬间秒杀活动来说明:

             下面这个程序模拟了20w人一瞬间涌入这个页面进行秒杀,能够秒杀成功的只有500人,我们把先进来的用户放入redis队列                  中,当队列中的用户达到500时,后来用户就转到秒杀结束页面。这里用随机数来表示不同的用户。
  
  
       在现实应用中,很多情况下会把数据存入缓存,当缓存失效时,去数据库取数据并重新设置缓存,如果这时并发量很大,会有很多进程同时去数据库取数据,导致很多请求穿透到数据库,而使数据库奔溃,这里可用文件锁来解决

 

乐观锁。悲观锁分别适用什么情况
      1. 对于数据更新频繁的场合,悲观锁效率更高。加锁的时间可能会很长,这样可能会长时间的限制其他用户的访问,也就是说悲观锁的并发访问性不好。
      2. 对于数据更新不频繁的场合,乐观锁效率更高。乐观锁是假定读取的数据,在写之前不会被更新。适用于数据更新不频繁的场景。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值