php redis处理并发问题

最近在弄并发问题,看到都是用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.5k
3 个回答

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

1秒是肯定有问题的

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

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

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

从商品列表里面拿出数据时即购买存在并发,不用redis的锁吗,获得锁才能操作如rpop及sadd,连惯操作可以使用管道,php-redis扩展可能没有这个管道,最后就是要查询redis里面各种key的长度及内存占用,然后优化相关的数据结构

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题