`
ZacMa
  • 浏览: 37667 次
  • 来自: 深圳
社区版块
存档分类
最新评论

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问题

 

 

分享到:
评论

相关推荐

    springboot+lombock+swagger2+easypoi+redis

    lombock应用,excel导入导出,swagger2集成,初步集成redis 部分pom.xml &lt;dependency&gt; &lt;groupId&gt;cn.afterturn&lt;/groupId&gt; &lt;artifactId&gt;easypoi-base&lt;/artifactId&gt; &lt;version&gt;3.0.3&lt;/version&gt; &lt;/...

    SpringBoot 如何集成 Redis ?

    &lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt; &lt;/dependency&gt; 在 application 配置文件中 书写 redis 配置 spring.redis.host=127.0.0.1 #Redis服务器连接端口 spring.redis.port=6379 #Redis...

    embedded-redis-0.6.jar

    &lt;!-- https://mvnrepository.com/artifact/com.orange.redis-embedded/embedded-redis --&gt; &lt;dependency&gt; &lt;groupId&gt;... &lt;artifactId&gt;embedded-redis&lt;/artifactId&gt; &lt;version&gt;0.6&lt;/version&gt; &lt;/dependency&gt;

    embedded-redis:Redis嵌入式服务器用于Java集成测试

    嵌入式redis 视窗 Linux Redis嵌入式服务器用于Java集成测试Maven依赖Maven Central: &lt; dependency&gt; &lt; groupId&gt;com.github.kstyrc&lt;/ groupId&gt; &lt; artifactId&gt;embedded-redis&lt;/ artifactId&gt; &lt; version&gt;0.6&lt;/ version&gt;...

    dokku-redis:dokku 的 redis 插件

    独库redis dokku 的官方 redis 插件。 当前默认安装 。...redis:backup &lt;service&gt; &lt;bucket&gt; [--use-iam] # creates a backup of the redis service to an existing s3 bucket redis:backup-auth &lt;service&gt;

    javabitset源码-redis-bloomfilter:基于Redis的BloomfilterforJava

    java bitset 源码 redis-bloomFilter redis-bloomFilter是...&lt;artifactId&gt;redis-bloomfilter&lt;/artifactId&gt; &lt;version&gt;1.1.0&lt;/version&gt; &lt;/dependency&gt; 示例 BloomFilter demo Redis-bloomFilter基于Guava的BloomFilter

    dropwizard-redis

    用法&lt; repository&gt;&lt; id&gt;git-47billion&lt;/ id&gt;&lt; name&gt;47billion's Git based repo&lt;/ name&gt;&lt; url&gt;https://github.com/47billion/maven-repo/raw/master&lt;/ url&gt;&lt;/ repository&gt; &lt; dependencies&gt; &lt; dependency&gt; &lt; groupId&gt;...

    save-mysql-redis.py

    save_mysql_redis.pysave_mysql_redis.pysave_mysql_redis.pysave_mysql_redis.pysave_mysql_redis.pysave_mysql_redis.pysave_mysql_redis.pysave_mysql_redis.pysave_mysql_redis.pysave_mysql_redis.pysave_mysql...

    resteasy-cache-redis:用于服务器端JAX-RS响应缓存的Redis支持的缓存

    &lt; artifactId&gt;resteasy-cache-redis&lt;/ artifactId&gt; &lt; version&gt;1.0.0&lt;/ version&gt; &lt;/ dependency&gt; 注意:目前,此工件仅在jCenter上可用(也许吗?)。 希望Maven Central即将面世。 用 在您的javax.ws.rs.core....

    Java商城 免费 开源 CRMEB商城JAVA版,SpringBoot + Maven + Swagger + Mybatis

    4. 运行环境 linux和windows等都支持,只要有Java环境和对应的数据库 redis 5. 运行条件 Java 1.8 Mysql5.7 Java项目框架 和 WEB PC 项目运行环境 1.SpringBoot 2.2.6.RELEASE&lt;br&gt; 2.Maven 3.6.1&lt;br&gt; 3.swagger-...

    c# Redis.helper源码标准库,下载即用,无删减.zip

    &lt;section name="RedisConfig" type="Redis.Helper.RedisConfigInfo,Redis.Helper"/&gt; &lt;/configSections&gt; &lt;!--Redis配置--&gt; &lt;RedisConfig WriteServerList="密码@192.168.1.232:6379" ReadServerList="密码@192....

    Redis部署笔记(单机+主从+哨兵+集群)

    ● 把Redis的Map封装成RedisMap&lt;T&gt;类(key强制为String),暴露API模仿Java的Map ● 把Redis的Set封装成RedisSet&lt;T&gt;类,暴露API模仿Java的Set ● 把Redis的List封装成RedisList&lt;T&gt;类,暴露API模仿Java的List ● 把...

    springboot+maven+mysql+redis框架

    springboot+maven+mysql+redis框架 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 5. 提供生产就绪型功能,如指标,健康检查和外部配置 6. 绝对没有代码生成和...

    基于Redis的分布式配置管理中心.zip

    即Redis和文件缓存中都找不到配置项时,客户端会从配置文件(app.properties)中加载。 在本地开发环境,可以不连接Redis,只使用配置文件(app.properties),以便于测试。 服务端 GUI尚未实现,暂时只能在key=config:{...

    tomcat-redis-session-8.5.5.0

    &lt; manager className = “ ru.zinin.redis.session.RedisManager ” jedisJndiName = “ custom / jndi / path ” /&gt; 嵌入式配置 见我们的嵌入式示例 添加tomcat-redis-session作为maven依赖关系: &lt; 依赖关系 &gt;...

    基于SpringBoot+MyBatis+mysql的飞机订票系统源码+数据库(高分毕设).zip

    【资源说明】 ...**React+SpringBoot+MyBatis+SpringSecurity+MySql+Redis**&lt;br/&gt; Linux服务器+Nginx+FastDFS文件服务器&lt;br/&gt;&lt;br/&gt; 更多细节点:&lt;br/&gt;AOP、IP-验证码、布隆过滤器、支付宝支付&lt;br/&gt;&lt;br/&gt;

    jedis-4.3.1

    &lt;groupId&gt;redis.clients&lt;/groupId&gt; &lt;artifactId&gt;jedis&lt;/artifactId&gt; &lt;version&gt;4.3.0&lt;/version&gt; &lt;/dependency&gt; 对于许多应用程序,最好使用连接池。实例化 Jedis 连接池: JedisPool pool = new JedisPool(...

    SpringBoot整合Redis、mybatis实战,封装RedisUtils工具类.docx

    引入Redis依赖 &lt;!--SpringBoot与Redis整合依赖--&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt; &lt;/dependency&gt;

    redis-mock-java:Java中Redis的内存中实现

    地位安装专家&lt; dependency&gt; &lt; groupId&gt;org.rarefiedredis.redis&lt;/ groupId&gt; &lt; artifactId&gt;redis-java&lt;/ artifactId&gt; &lt; version&gt;0.0.5&lt;/ version&gt;&lt;/ dependency&gt;用法去做线程安全RedisMock对象本身是完全线程安全的。...

    spring-boot-redis-cache

    &lt; artifactId&gt;spring-boot-starter-data-redis&lt;/ artifactId&gt; &lt;/ dependency&gt; &lt; dependency&gt; &lt; groupId&gt;redis.clients&lt;/ groupId&gt; &lt; artifactId&gt;jedis&lt;/ artifactId&gt; &lt;/ dependency&gt; Redis 配置 @...

Global site tag (gtag.js) - Google Analytics