资讯专栏INFORMATION COLUMN

Mysql数据批量导入Redis

genefy / 1512人阅读

摘要:将命令封装成通信协议定义的数据格式,批量发送给执行执行命令后,如果出现类似以下提示,这说明导入正确可以打开输入或者命令来进行查询。

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

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

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

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

*4
$5
HMSET
$8
person:1
$2
id
$1
1

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

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

SELECT CONCAT(
  "*8
",
  "$", LENGTH(redis_cmd), "
", redis_cmd, "
",
  "$", LENGTH(hash), "
",  hash, "
",
  "$", LENGTH(hkey0), "
",  hkey0, "
",
  "$", LENGTH(hval0), "
",  hval0, "
",
  "$", LENGTH(hkey1), "
",  hkey1, "
",
  "$", LENGTH(hval1), "
",  hval1, "
",
  "$", LENGTH(hkey2), "
",  hkey2, "
",
  "$", LENGTH(hval2), "
",  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使用 ,linux使用

上面的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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77042.html

相关文章

  • PHP+Mysql高并发解决

    摘要:更多详情,请看原文章批量插入性能优化相关文章高并发简单解决方案队列缓存批量入库离线整合秒杀活动设计方案 在项目中,经常都会遇到高并发问题,如在某个时间点有100个人对同一数据进行更改,这样就会产生问题,最后导致的数据会不准确,通常的解决高并发的方法有读取数据时加缓存,写入数据时添加到队列,下面罗列一些处理高并发的常见方法供大家参考。 一、MySQL批量插入优化 对于一些数据量较大的系统...

    wuyangchun 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<