美文网首页java高级开发
Mysql数据批量导入Redis

Mysql数据批量导入Redis

作者: 老鼠AI大米_Java全栈 | 来源:发表于2018-09-08 22:45 被阅读106次

    为了提高系统性能,在很多系统中使用Redis作为缓存数据库,那么在系统启动或重启后,希望把DB的数据初始化到Redis以提高系统的性能,应该如何批量导入大量的数据呢?

    要导入数据,就要先了解Redis的协议(RESP),然后用sql拼接数据交给redis导入,RESP格式如下:

    *n (*表示数组,按$划分)
    $n (表示参数长度)  cmd  (表示命令)
    $n (表示参数长度)  field  (表示字段)
    $n (表示参数长度)  value  (表示值)
    ...
    

    我们拼个简单的数据,如下:

    *4\r\n$5\r\nHMSET\r\n$8\r\nperson:1\r\n$2\r\nid\r\n$1\r\n1\r
    

    上面表示有4组,5表示HMSET的长度,8表示person:1长度。。。
    命令:HMSET person:1 id 1

    下面我们再写下sql,如下:

    SELECT CONCAT(
      "*8\n",
      '$', LENGTH(redis_cmd), '\n', redis_cmd, '\n',
      '$', LENGTH(hash), '\n',  hash, '\n',
      '$', LENGTH(hkey0), '\n',  hkey0, '\n',
      '$', LENGTH(hval0), '\n',  hval0, '\n',
      '$', LENGTH(hkey1), '\n',  hkey1, '\n',
      '$', LENGTH(hval1), '\n',  hval1, '\n',
      '$', LENGTH(hkey2), '\n',  hkey2, '\n',
      '$', LENGTH(hval2), '\n',  hval2, ''
    )
    FROM (
      SELECT
      'HMSET' AS redis_cmd, concat('hash:', id) AS hash,
      'id' AS hkey0,  id AS hval0,
      'age' AS hkey1,  age AS hval1,
      'name' AS hkey2,  name AS hval2
      FROM mytable
    ) AS t;
    

    注意:换行符 windows使用 \n ,linux使用 \r\n

    上面的sql可以组装redis需要的数据,下面我们编写导入命令:

    mysql -uroot -proot -Dxfdb --default-character-set=utf8 --skip-column-names 
    --raw < mysql_to_redis.sql | redis-cli -h 127.0.0.1 --pipe
    

    --raw: 使mysql不转换字段值中的换行符。
    --skip-column-names: 使mysql输出的每行中不包含列名。
    --pipe 将命令封装成redis通信协议定义的数据格式,批量发送给redis执行

    执行命令后,如果出现类似以下提示,这说明导入正确:

    All data transferred. Waiting for the last reply...
    Last reply received from server.
    errors: 0, replies: 3
    

    可以打开 Redis-cli 输入dbsize或者keys *命令来进行查询。
    学习交流,请加群:64691032

    相关文章

      网友评论

        本文标题:Mysql数据批量导入Redis

        本文链接:https://www.haomeiwen.com/subject/deilgftx.html