mysql数据复制至redis的一种应用场景 bash实现

由于目前仅仅通过mysql来进行数据的存储,要完成复杂的数据统计耗时较长。因此考虑将部分数据导入到redis中,完成数据统计后,再将结果存入mysql。

    经查资料,利用管道的方式可以绕开第三方的数据交互过程,数据直接从mysql导入到redis的速度非常快。在笔者的测试环境中,500w级别的数据大概用时40秒(当然了,与mysql的查询耗时有关)。

    另外,由于mysql表设计的问题,大部分数据存储在结构相同的不同表中。比如表A存储了用户"启动应用"这个事件数据, 表B存储了用户"打开设置页面"的事件数据, 但是表A和表B的结构都是一样的。 目前在通过mysql来做数据统计时,是按顺序的来进行操作,统计完了A,再统计B。

   而在redis中,表A和表B的数据和以放在同一个数据库中,然后利用set之类的容器将各个事件的数据分类存储起来,遍历一次便可以完成所有事件数据的统计。

    因此,现在的应用场景为: 批量导出mysql中各个表的相同条件的数据(如同为某一天的数据), 导入redis,最后合并完成统计。具体的导出导入代码如下所示(mysql2redis.sh):

[plain] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. !/bin/bash  
  2.   
  3. mysql_host=192.168.x.xx  
  4. mysql_user=xiaomo  
  5. mysql_pwd=xiaomo   
  6. database=test_db  
  7. tbls_prefix="test_tbl_name_prefix"  
  8. #调用shell时,传入的日期参数  
  9. cur_dt="$1"    
  10. #遍历表,返回表名list  
  11. table_list=$(mysql -h$mysql_host -u$mysql_user -p$mysql_pwd $database -A -Bse "show tables")   
  12.   
  13. function gen_sql()  
  14. {  
  15.   src_tbl=$1  
  16.   mysql2redis="SELECT CONCAT(\  
  17.     '*10\r\n',\  
  18.     '$', LENGTH(redis_cmd), '\r\n',redis_cmd, '\r\n',\  
  19.     '$', LENGTH(redis_key), '\r\n',redis_key, '\r\n',\  
  20.     '$', LENGTH(hkey1), '\r\n', hkey1, '\r\n',\  
  21.     '$', LENGTH(hval1), '\r\n', hval1, '\r\n',\  
  22.     '$', LENGTH(hkey2), '\r\n', hkey2, '\r\n',\  
  23.     '$', LENGTH(hval2), '\r\n', hval2, '\r\n',\  
  24.     '$', LENGTH(hkey3), '\r\n', hkey3, '\r\n',\  
  25.     '$', LENGTH(hval3), '\r\n', hval3, '\r\n',\  
  26.     '$', LENGTH(hkey4), '\r\n', hkey4, '\r\n',\  
  27.     '$', LENGTH(hval4), '\r\n', hval4, '\r'\  
  28.   )\  
  29.   FROM (\  
  30.     SELECT\  
  31.     'HMSET' AS redis_cmd, uniq_id AS redis_key,\  
  32.     'f1' AS hkey1, f1 AS hval1,\  
  33.     'f2' AS hkey2, f2 AS hval2,\  
  34.     'f3' AS hkey3, f3 AS hval3,\  
  35.     'f4' AS hkey4, f4 AS hval4\  
  36.     FROM $src_tbl WHERE dt='$cur_dt'\  
  37.   ) AS T"  
  38.   echo "$mysql2redis"  
  39. }  
  40.   
  41. prefix_len=$(expr length $tbls_prefix)  
  42. for arg in $table_list  
  43. do  
  44.   if [[ "${arg:0:$prefix_len}" == ${tbls_prefix} ]] # 判断表名是否匹配(表名以指定前缀开头)  
  45.   then  
  46.     mysql2redisCmd=$(gen_sql $arg)  
  47.     echo $mysql2redisCmd | mysql -u$mysql_user -p$mysql_pwd -h$mysql_host $database --skip-column-names --raw | redis-cli -n 1 --pipe  
  48.   fi                                                                                                                                      done  

调用示例: /bin/bash mysql2redis.sh 2014-03-08


另: 可参考redis的resp协议文档 http://redis.io/topics/protocol


http://blog.csdn.net/moxiaomomo/article/details/20787071

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值