第一种方法:使用insert into 插入

从Redis每次获取100条数据,根据条件去插入到Mysql数据库中:

条件:

如果当前队列中的值大于1000条,则会自动的条用该方法,该方法每次获取从队列的头部每次获取100掉数据插入到Mysql数据库中,同时以当前队列的长度为插入条件。

1000为原始数据,从队列头获取100条,插入到Mysql数据,同时删除已经插入的数据,再通过队列的长度判断是否继续插入,直到循环不满足条件为止。

[1]获取头100条数据:$redis->lRange($liveKey,0,99)

[2]删除头100条数据:$redis->lTrim($liveKey, 100, -1);

[1]获取当前队列长度:$redis->lLen($liveKey);

  1. public function redisSaveMysqlAction()
  2. {
  3. $liveKey = $this->request->getQuery('liveKey');
  4. if(empty($liveKey)){
  5. $result = array("errcode" => 500, "errmsg" => "this parameter is empty!");
  6. return $this->toJson($result);
  7. }
  8. $redis = new \Redis();
  9. $redis->connect('1.1.2.16', '6379');
  10. $redisInfo = $redis->lRange($liveKey,0,99);
  11. $dataLength = $redis->lLen($liveKey);
  12. while($dataLength > 200) {
  13. try {
  14. $this->db->begin();
  15. foreach ($redisInfo as $action) {
  16. $sql = "INSERT INTO livecomment (liveId,username,createTime,userId,content) VALUES (?, ? ,?,? ,?)";
  17. $this->db->execute($sql, array(
  18. json_decode($action,true)['roomId'],
  19. json_decode($action,true)['userName'],
  20. json_decode($action,true)['createTime'],
  21. json_decode($action,true)['userId'],
  22. json_decode($action,true)['content'],
  23. ));
  24. }
  25. $redis->set('message_insert_success', '1');
  26. $redis->lTrim($liveKey, 100, -1);
  27. $redisInfo = $redis->lRange($liveKey,0,99); // 这句也要重新的获取,不然就会插入重复的数据,也就是获取删除后的数据
  28. $dataLength = $redis->lLen($liveKey); //注意这句一定要加上的,做为下一次的判断标准,当插入完后和删除后,重新获取列表的长度,作为条件依据
  29. $redis->set('dataLength_backenk', $dataLength);
  30. $this->db->commit();
  31. } catch (\Exception $e) {
  32. $redis->set('message_insert_fail', '0');
  33. $this->db->rollback();
  34. }
  35. }
  36. $redis->set('log'.$liveKey,$redis->incr('request_counts'));
  37. $result = array("errcode" => 200, "errmsg" => "Data Insert into Success!",'data'=>'dataLength:'.$dataLength.'liveKey:'.$liveKey);
  38. return $this->toJson($result);

第二种方法:使用优化SQL语句:将SQL语句进行拼接,使用 insert into table () values  (),(),(),()然后再一次性插入,如果字符串太长,则需要配置下MYSQL,在mysql 命令行中运行 :set global max_allowed_packet =  2*1024*1024*10;

拼接后的字符串:

  1. 'insert into twenty_million (value) values('50'),('50'),('50'),('50'),('50'),('50'),('50'),('50'),('50'),('50')'

实际案例:

  1. /**
  2. * 获取Redis数据批量的保存到Redis中去解析Redis数据的json格式
  3. */
  4. public function RedisSaveToMysqlJsonAction()
  5. {
  6. $redis = RedisInstance::getInstance();
  7. $redis->select(1);
  8. $redisInfo = $redis->lRange('message01',0,9999);
  9. $dataLength = $redis->lLen('message01');
  10. $redis->set('dataLength_front',$dataLength);
  11. $t1=microtime(true);
  12. while($dataLength > 20000) {
  13. try {
  14. $this->db->begin();
  15. $sql = "INSERT INTO stream_name (name,createTime,userId,content) VALUES";
  16. foreach ($redisInfo as $action) {
  17. $sql .= "('" . json_decode($action, true)['userName'] . "',
  18. '" . json_decode($action, true)['createTime'] . "',
  19. '" . json_decode($action, true)['userId'] . "',
  20. '" . json_decode($action, true)['content'] . "'),";
  21. }
  22. $sql = rtrim($sql, ',');
  23. $this->db->execute($sql);
  24. $redis->lTrim('message01', 10000, -1);
  25. $redisInfo = $redis->lRange('message01',0,9999);
  26. $dataLength = $redis->lLen('message01');
  27. $this->db->commit();
  28. } catch (\Exception $e) {
  29. $redis->set('message_catch', json_encode($e));
  30. $this->db->rollback();
  31. }
  32. }
  33. echo 'ENDTIME:'.(microtime(true)-$t1)."<BR/>";
  34. echo 'success';
  35. die;
  36. }

输出结果为:

  1. ENDTIME:3.0146479606628(s)
  2. success

Mysql数据库实践操作之————批量插入数据(100万级别的数据)的更多相关文章

  1. 关于批量插入数据之我见(100万级别的数据,mysql) (转)

    因前段时间去面试,问到如何高效向数据库插入10万条记录,之前没处理过类似问题,也没看过相关资料,结果没答上来,今天就查了些资料,总结出三种方法: 测试数据库为MySQL!!! 方法一: public  ...

  2. 关于批量插入数据之我见(100万级别的数据,mysql)

    因前段时间去面试,问到怎样高效向数据库插入10万条记录,之前没处理过类似问题.也没看过相关资料,结果没答上来,今天就查了些资料.总结出三种方法: 測试数据库为mysql!!! 方法一: public ...

  3. .net使用SqlBulkCopy类操作DataTable批量插入数据库数据,然后分页查询坑

    在使用SqlBulkCopy类操作DataTable批量插入数据,这种操作插入数据的效率很高,就会导致每一条数据在保存的时间基本一样,在我们分页查询添加的数据是,使用数据的添加时间来排序就会出现每页的 ...

  4. mysql三种带事务批量插入

    原文:mysql三种带事务批量插入 c#之mysql三种带事务批量插入 前言 对于像我这样的业务程序员开发一些表单内容是家常便饭的事情,说道表单 我们都避免不了多行内容的提交,多行内容保存,自然要用到 ...

  5. DBA必备:MySQL数据库常用操作和技巧

    DBA必备:MySQL数据库常用操作和技巧 2011-02-25 15:31 kaduo it168 字号:T | T MySQL数据库可以说是DBA们最常见和常用的数据库之一,为了方便大家使用,老M ...

  6. Mysql数据库基础操作

    Mysql数据库基础操作 在mysql数据库中开启使用tab键补全功能 1)修改主配置文件/etc/mysql/my.cnf(mysql和mariadb目录有些不同) vim /etc/mysql/m ...

  7. MySQL 数据库高级操作 (配图)

    MySQL数据库高级操作 1.一键部署mysql 数据库 2.数据表高级操作 3.数据库用户管理 4.数据库用户授权 1.首先一键部署mysql 数据库 : 可以看我之前的博客 https://www ...

  8. zabbix数据库mariadb从服务器迁移到云mysql数据库的操作

    zabbix数据库mariadb从本机迁移到云mysql数据库的操作 1.将zabbix数据库导出,并导入到云数据库中 由于数据库较大,如果直接使用shell会话中断会导致数据库导出或者导入失败,使用 ...

  9. Database学习 - mysql 数据库 表操作

    mysql 数据库 表操作 创建数据表 基本语法格式: 创建数据表: create table 表名( 字段名 datatype 约束, 字段名 datatype 约束, ...... ) 修改表名 ...

随机推荐

  1. 【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.10.Button 和 Autocomplete控件

    Button ,可以使用 <button> <input> <a>. <input> 中的不同类型,submit , radio , checkbox ...

  2. iOS 处理多个网络请求的并发的情况

    如何处理多个网络请求的并发的情况 一.概念 1.并发 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配 ...

  3. ios tabbar 文字位置

    [nav.tabBarItem setTitlePositionAdjustment)];

  4. java面试每日一题12

    题目:打印出如下图案(菱形)     *    ***  ****** ********  ******   ***    * public class Diamond { public static ...

  5. 天大acm 题号1002 Maya Calendar

    Description 上周末,M.A. Ya教授对古老的玛雅有了一个重大发现.从一个古老的节绳(玛雅人用于记事的工具)中,教授发现玛雅人使用了一个一年有365天的叫做Haab的历法.这 个Haab历 ...

  6. C#的OpenFileDialog和SaveFileDialog的常见用法(转)

    OpenFileDialog openFileDialog1 = new OpenFileDialog();            openFileDialog1.InitialDirectory = ...

  7. YTU 2924: 文件操作--二进制文件读入

    2924: 文件操作--二进制文件读入 时间限制: 1 Sec  内存限制: 128 MB 提交: 58  解决: 20 题目描述 现有100名学生的姓名(name).学号(num).英语(Engli ...

  8. Spring框架bean的配置(3):基于注解的配置

    1.基于注解的配置: @Component: 基本注解, 标识了一个受 Spring 管理的组件 @Respository: 标识持久层组件 @Service: 标识服务层(业务层)组件 @Contr ...

  9. DAO模型设计实现数据的 增,删,改,查方法

    连接数据库方法,及反射获取数据,以前的方法相同,测试类 是在DAO模型下建立的 ------------------------------------------------------------ ...

  10. U3D UGUI学习4 - Text

    1.对应NGUI的四种文字显示模式 Shrink Content 对应NGUI第一种模式     勾选Best Fit 但似乎有一个Bug,文字过多的时候会爆框.解决方法是改变Line Spacing ...