为了账号安全,请及时绑定邮箱和手机立即绑定

php redis处理并发问题

php redis处理并发问题

PHP
米琪卡哇伊 2019-03-07 05:25:25
最近在弄并发问题,看到都是用redis队列处理并发的,所以我也弄弄看,用Linux的webbench模拟并发请求,但我发现使用redis速度很慢,只是简单的读取数据操作lget()操作都要1秒钟,循环入队1000次的时间也只是1秒多一点,然后在模拟并发的时候,使用redis处理1000个并发请求,用时16秒,但我直接操作数据库也才12秒而已。问题1:为什么直接操作数据库会比使用redis缓存快?问题2:为什么redis的一个读操作都要至少1秒?下面贴接口代码 redis处理接口: public function redis_qianghuo(){ $redis = $this->Redis(); //查询库存 if($redis->lLen('goods_list') == 0) $this->ajaxReturn('商品已售完...'); $uid = $_SERVER['REMOTE_PORT']; //查询是否购买过 if($redis->sIsMember('bought_list',$uid)) $this->ajaxReturn('你已经购买过了!'); $goods_id = $redis->rpop('goods_list'); $redis->sAdd('bought_list',$uid); $value = array( 'uid' => $uid, 'goods_id' => $goods_id, 'time' => time(), ); $redis->hSet('order_info',$uid,json_encode($value)); $this->ajaxReturn('购买成功。'); } sql处理接口: public function sql_qianghuo(){ $order_model = M('order'); $goods_model = M('goods'); M()->startTrans(); //查询库存 if($goods_model->lock(true)->find(1)['goods_num'] == 0) $this->ajaxReturn('商品已售完...'); $uid = $_SERVER['REMOTE_PORT']; //查询是否购买过 if($order_model->where(array('uid'=>$uid))->find()) $this->ajaxReturn('你已经购买过了!'); $value = array( 'uid' => $uid, 'time' => time(), ); $order_model->add($value); $goods_model->where(array('id'=>1))->lock(true)->setDec('goods_num',1); M()->commit(); $this->ajaxReturn('购买成功。'); }
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

首先你确定你本地配置没有问题?如果单个的读取都能达到1秒那肯定本地配置有问题

查看完整回答
反对 回复 2019-03-18
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

1秒是肯定有问题的

  • 首先判断配置是否存在问题,redis是内存数据库,所以内存要可以,本身需要消耗内存,另外存储数据库也需要内存
  • redis存储的这个数据的长度

*另外其实在线上的服务redis也是需要有连接池的,包括mysql 可以参考phpcp和360的mysql连接池

其实应该主要是环境配置的问题

查看完整回答
反对 回复 2019-03-18
  • 3 回答
  • 0 关注
  • 519 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信