• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

mysql 搞代码 7年前 (2018-06-08) 144次浏览 已收录 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的封包结果来解包 //通过网页输入的id  echo "-------------------------------------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问题

 

 

欢迎大家阅读《mysql跟redis存查取简单对比<37&gt_mysql》,跪求各位点评,by 搞代码


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql跟redis存查取简单对比<37&gt_mysql

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址