当前位置: 代码迷 >> MySQL >> mysql跟redis存查取简单对比<37>
  详细解决方案

mysql跟redis存查取简单对比<37>

热度:58   发布时间:2016-05-05 16:57:51.0
mysql和redis存查取简单对比<37>

简单总结下对redis和mysql的认识:

redis:?

存取速度非常快,通常比mysql快很多(根据数据量大小,下面有具体示例)

容易部署和维护, redis很容易部署,并且容易使用,不像sql有复杂的语句

非常适合结构不复杂的key,value试的存储

缺点是所有数据都存在于内存之中,即使你进行了固化,数据在内存中也仍然有一份,如果内存中的数据有改变,要自己手动固化,但是如果简单的用bgsave会对整个都固化,即使小量改变,仍然开销较大,而redis本身并未提供部分的固化

?

mysql

存取速度都比redis慢,但是结构化很完善,如果结构比较复杂的存储,非常适合

缺点是想非常深入了解,定制化使用比较困难,需要相当功底,不像redis,源代码量不大,相比起来简单很多

?

下面直奔主题,就是测试在同等机器配置下,同样数据量下,redis和mysql的存储速度

首先看php测试源码:

?

class DBConn{    private static $db_host="localhost";//服务器    private static $db_user="root";//用户名    private static $db_psw="111111";//密码    private static $db_name="test_zm";//数据库名    private static $connection;       static function getConn(){        $connection=new mysqli(self::$db_host,self::$db_user,self::$db_psw,self::$db_name);        return $connection;    }}class UserModel{    ////运用单例模式    private static $cennct = null;    private static $instance = null;         private function __construct() {    }    public function __destruct() {    }      private static function conn() {        return DBConn::getConn();                      }      private static function  getdb(){        if (self::$cennct == null)            self::$cennct = self::conn();        return self::$cennct;      }    private static function getself(){         if (!(self::$instance instanceof self)) {            self::$instance = new UserModel();         }        return  self::$instance;      }     public function __clone(){        trigger_error('Clone is not allow!',E_USER_ERROR);    }    // 获取单例    final public static function getInstance() {        return UserModel::getself();    }    function testinsert($key,$value) {        $mysqli= self::getdb();        $mysqli->query("set names utf-8");//转换字符编码格式        $query="insert into testspeed (key1,value1) values (?,?)";        $result=$mysqli->prepare($query);        $result->bind_param("ss",$key,$value); //参数绑定                            $result->execute();    }       function testget($key) {        $mysqli= self::getdb();        $mysqli->query("set names utf-8");//转换字符编码格式        $query="select value1 from testspeed where key1=?";        $result=$mysqli->prepare($query);        $result->bind_param("s",$key); //参数绑定                            $result->execute();    }    //关注用户    function testdel($key){           $mysqli=self::getdb();        $mysqli->query("set names utf-8");//转换字符编码格式        $query="delete from testspeed where key1=?";        $result=$mysqli->prepare($query);        $result->bind_param("s",$key); //参数绑定                                                                           $result->execute();    }}//测试/*-------------------------------test-------------------------------*/echo "-------------------------------------insert-------------------------\n";$UserModel2 =  UserModel::getInstance();$time = time();echo "time=$time\n";for($i = 0; $i < 100000; $i++){    $UserModel2->testinsert("test$i","test$i");}$time = time();echo "time=$time\n";echo "-------------------------------------select-------------------------\n";$time = time();echo "time=$time\n";for($i = 0; $i < 100000; $i++){    $UserModel2->testget("test$i");}$time = time();echo "time=$time\n";echo "-------------------------------------delete-------------------------\n";$time = time();echo "time=$time\n";for($i = 0; $i < 100000; $i++){    $UserModel2->testdel("test$i");}$time = time();echo "time=$time\n";

?

程序中用到的表结构:--
/*-- 表的结构 `testspeed`
CREATE TABLE IF NOT EXISTS `testspeed` (
? `id` int(11) NOT NULL AUTO_INCREMENT,
? `key1` varchar(16) NOT NULL,
? `value1` varchar(16) NOT NULL,
? PRIMARY KEY (`id`),
? KEY `key` (`key1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
测试环境,双核奔腾E5800,3.2GHZ,内存4G
测试报告: 1000条数据,
插入1s,删除小于1s,查询小于1s
测试报告: 10000条数据,
插入2s,删除2s,查询1s
测试报告: 10w条数据,
插入15s,删除16s,查询21s

?

?

?

再看redis测试源码:

redis用的是predis客户端,predis的下载地址:https://packagist.org/packages/predis/predis

require __DIR__.'/shared.php';//single_server这个变量在shared.php中定义$client = new Predis\Client($single_server);// 这里是php的大小端封包,pack()// 这里按照erlang的封包结果来解包//通过网页输入的idecho "-------------------------------------set-------------------------\n";$time = time();echo "time=$time\n";for($i = 0; $i < 100000; $i++){    $response = $client->set("test$i","test$i");}$time = time();echo "time=$time\n";echo "-------------------------------------get-------------------------\n";$time = time();echo "time=$time\n";for($i = 0; $i < 100000; $i++){    $response = $client->get("test$i");}$time = time();echo "time=$time\n";echo "-------------------------------------delete-------------------------\n";$time = time();echo "time=$time\n";for($i = 0; $i < 100000; $i++){    $response = $client->del("test$i");}$time = time();echo "time=$time\n";

测试环境,双核奔腾E5800,3.2GHZ, 内存4G
测试set 10w条不同key,不同value数据需要5s
测试 get 10w条不同key,value的数据需要4s
测试delete 10w条不同key,不同value数据需要4s

有以上看来,在同样配置的机器上,redis和mysql对同样的数据操作,

存储,查询,读取的速度,redis是mysql的3-5倍,并且该值会随着数据量的加大而有更大的差距,

并且mysql选择的存储引擎是myisam,是个纯内存引擎,如果是innodb类的,结果可能更悬殊,

所以数据量大的,机器性能又不高,就只能改为cache,而不是单纯的sql,

mysql慢的另一点是对事务的支持,isam引擎在写数据时候是全表锁的

?

?欢迎加入web聊天群:457101767,共同探讨web问题

?

?

  相关解决方案