Redis的插入速度比MySQL慢?

是这样的, 心血来潮, 想测试一下 redis 有多快, 经过我测试, 发现 Redis总是比MySQL慢一点,我想知道是什么原因, 望指教。
代码如下:

<?php


    $driver = "redis";
    // 测试 mysql 驱动时,打开注释
    // $driver = "mysql";
    // 插入的条数
    const SIZE = 10000;

    // 
    $t1 = microtime(true);

    // 为了方便测试,插入的数据是固定的
    $name = "test";
    $pwd = "####";
    $age = 21;

    if ($driver === 'redis')
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379) or die('redis 服务未启动');
        $redis->setOption(Redis::OPT_PREFIX,'hash_');

    
        for ($i = 0; $i < SIZE; ++ $i)
        {
            // 就用用户名做哈希名,不允许重复用户名
            $redis->hSet($i, 'name', $name);
            $redis->hSet($i, 'pwd', $pwd);
            $redis->hSet($i, 'age', $age);
        }

        $redis->close();
    }
    else
    {

        // $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'root');

        for ($i = 0; $i < SIZE; ++ $i)
        {
        
            $sql = "insert into `redis_user`(`name`, `pwd`, `age`) values('{$name}', '{$pwd}', '{$age}')";
            
            $dbh->exec($sql);
        }

        $dbh = null;
    }

    $t2 = microtime(true);


    /**
    *                   插入 10000 条数据
    * 使用 redis 驱动 共插入了 10000 条数据, 时间使用:3.4171187877655
    * 使用 mysql 驱动 共插入了 10000 条数据, 时间使用:2.771833896637
    *
    *                   插入 100000 条数据
    * 使用 redis 驱动 共插入了 100000 条数据, 时间使用:34.385821819305
    * 使用 mysql 驱动 共插入了 100000 条数据, 时间使用:18.874236822128
    */
    echo "使用 {$driver} 驱动 共插入了 {$i} 条数据, 时间使用:" . ($t2 - $t1); 

如果是代码上的原因,望指出

阅读 7.1k
4 个回答

你使用mysql 插入的时候,是一次插入一条name,pwd,age的记录,发送插入请求次数是:10000次
但是使用redis的时候,name,pwd,age分三次插入了,发送插入请求次数其实是:10000 * 3次,是mysql 的 3倍。redis觉得很冤枉。

你把redis 修改为一次插入name、pwd、age,这样才公平。参考代码(php不会,代码参考下)

 for ($i = 0; $i < SIZE; ++ $i)
        {
           // key相当于表redis_user,field相当于主键,value就是一条记录,值是$name和$pwd和$age拼接在一起。
            $redis->hSet('redis_user',$i, $name + $pwd + $age);
        }
        
<?php


    $driver = "redis";
    $driver = "mysql";
    // 插入的条数
    const SIZE = 100000;

    // 
    $t1 = microtime(true);

    // 为了方便测试,插入的数据是固定的
    $name = "test";
    $pwd = "####";
    $age = 21;

    if ($driver === 'redis')
    {
        $redis = new Redis();
        $redis->connect('127.0.0.1', 6379) or die('redis 服务未启动');
        $redis->setOption(Redis::OPT_PREFIX,'hash_');


        for ($i = 0; $i < SIZE; ++ $i)
        {
            
            // 就用用户名做哈希名,不允许重复用户名
            $redis->hSet($i, 'name', $name . '#' . $pwd . '#' . $age);

        }
        $redis->close();
        
    }
    else
    {

        $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', 'root');

        for ($i = 0; $i < SIZE; ++ $i)
        {
            
        
            $sql = "insert into `redis_user`(`name`, `pwd`, `age`) values('{$name}', '{$pwd}', '{$age}')";
            
            $dbh->exec($sql);
            
        }

        $dbh = null;

        
    }

    $t2 = microtime(true);


    /**
    *                   插入 1000 条数据
    * 使用 redis 驱动 共插入了 1000 条数据, 时间使用:0.20561599731445
    * 使用 mysql 驱动 共插入了 1000 条数据, 时间使用:1.5798699855804
    *                   10000 条数据
    * 使用 redis 驱动 共插入了 10000 条数据, 时间使用:1.6717090606689
    * 使用 mysql 驱动 共插入了 10000 条数据, 时间使用:4.0666799545288
    *                   100000 条数据
    * 使用 redis 驱动 共插入了 100000 条数据, 时间使用:15.782356023788
    * 使用 mysql 驱动 共插入了 100000 条数据, 时间使用:27.720022916794
    */
    echo "使用 {$driver} 驱动 共插入了 {$i} 条数据, 时间使用:" . ($t2 - $t1); 

这是根据 helloworld_ 朋友回答之后的测试, 确实是变快了。


补充, 我通过 ab 压力测试, 发现差距更是巨大
第一张图是redis 的
图片描述
图片描述
ab 测试的时候, 我把for循环删去了

并非Redis比MySQL慢,而是时间都消耗在网络上了(即便访问本机也占用网络开销的)。

可以试试Redis的multi-set或pipeline功能(一次网络开销写入多条数据),然后跟MySQL的multi-insert相比较。

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