php redis实现在高并发下防止库存超卖解决方案
我直接用set get来实现 毕竟他速度最快。。
$prize_id=2; //读取库存 如果缓存没数据那就先读取数据库 里面也实现了分布式锁 $sql='select prizecount from dsfs_prizelimit where id=?'; $key='prizeid'.$prize_id; $prizecount=$this->getcacheinfo($sql,array($prize_id),$key,-1)[0]['prizecount']; //如果没有库存了 if($prizecount<=0){ exit(); } //实现购买逻辑 //库存减去1 这个地方要注意 mysql事务成功后再去执行redis $redis->set($key,$prizecount-1);
ps: 进入购买逻辑 如果购买失败 redis库存还是要减去的
上面代码看的出来如果在高并发下明显力不从心
所以要让代码进化下 用redis 分段加锁 另外1redis 生成2个redis
直接把库存读取出来 比如100
分成2个就是除以2
$redis->set(‘ss1’,50);
$redis->set(‘ss2’,50);
然后随机读取就行
不过上面代码只能加快了判断速度判断库存速度 下面购买逻辑速度还是一样
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/4079.html