应用:平常在使用redis 跟mysql做数据同步的时候, 难免会用到这些东西。从mysql里面查询数据,然后塞入到redis里面。适用在大数据预加载数据,批量导入。算是间接的一种调用方法。启动之前,就直接把msql数据,同步到了redis里面。
其实就是个sql文件,不过这样写,我还是觉得沙雕了点。完全可以用一些批量转换的工具,找了一圈发现没有。或者好用的,总是有各种欠缺。所以最后我还是用回了这个。git上有一个用go写的(go-mysql-transfer),用了一下,感觉还是差强人意。有用go的可以试试。下面看下这个脚本怎么写,根据一些官方的提示,协议约定。大致就长下面我写的这样。
SELECT CONCAT(
"*20\r\n", -- *表示数组,20表示有10个元素个数*,大概类似就是元素个数X2,得到上面这个数字。\r\n是linux中分隔符,这个数字根据下面红底字段数量进行调整
'$', LENGTH(redis_cmd), '\r\n', redis_cmd, '\r\n',
'$', LENGTH(redis_key), '\r\n', redis_key, '\r\n',
'$', LENGTH(hkey1), '\r\n', hkey1, '\r\n', '$', LENGTH(hval1), '\r\n', hval1, '\r\n',
'$', LENGTH(hkey2), '\r\n', hkey2, '\r\n', '$', LENGTH(hval2), '\r\n', hval2, '\r\n',
'$', LENGTH(hkey3), '\r\n', hkey3, '\r\n', '$', LENGTH(hval3), '\r\n', hval3, '\r\n',
'$', LENGTH(hkey4), '\r\n', hkey4, '\r\n', '$', LENGTH(hval4), '\r\n', hval4, '\r\n',
'$', LENGTH(hkey5), '\r\n', hkey5, '\r\n', '$', LENGTH(hval5), '\r\n', hval5, '\r\n',
'$', LENGTH(hkey6), '\r\n', hkey6, '\r\n', '$', LENGTH(hval6), '\r\n', hval6, '\r\n',
'$', LENGTH(hkey7), '\r\n', hkey7, '\r\n', '$', LENGTH(hval7), '\r\n', hval7, '\r\n',
'$', LENGTH(hkey8), '\r\n', hkey8, '\r\n', '$', LENGTH(hval8), '\r\n', hval8, '\r\n',
'$', LENGTH(hkey9), '\r\n', hkey9, '\r\n', '$', LENGTH(hval9), '\r\n', hval9, '\r' --这是结束,没有\n
-- '$', LENGTH(hkey10), '\r\n', hkey10, \r\n', $', LENGTH(hval10), \r\n', hval10, \r',
)
FROM (
SELECT
'HMSET' as redis_cmd, --这里用了hmset命令,可以一对多。
CONCAT('id:' ,id) AS redis_key, --这里表示使用命名空间,id为主键索引 ,下面的字段就是对应上面hkey与hval。
'name' AS hkey1, name AS hval1,
'password' AS hkey2, password AS hval2,
'lastsvrid1' AS hkey3, if(lastsvrid1 is not null, lastsvrid1, '') AS hval3,
'lastsvrid2' AS hkey4, if(lastsvrid2 is not null, lastsvrid2, '') AS hval4,
'channel' AS hkey5, if(channel is not null, channel, '') AS hval5,
'logincount' AS hkey6, if(logincount is not null, logincount, '') AS hval6,
'create_time' AS hkey7, if(create_time is not null, create_time, '') AS hval7,
'seal_end_time' AS hkey8, if(seal_end_time is not null, seal_end_time, '') AS hval8,
'seal_describle' AS hkey9, if(seal_describle is not null, seal_describle, '') AS hval9 --结束没有 逗号
FROM account --表名
) AS t;
首先随便命名一个文件,点后缀叫啥,无所谓(.sql,.txt,.csv都行)为了方便查看效果,我就用.sql了。打开记事本,开始编写。有些需要注意的地方,多少都注释到了。下面是一些,细节上的东西。想了解的可以看看。 不想看的直接拷走哪去运行也可以。
写好这个查询文件之后,保存。就类似有一个这样的文件。
再写一个bash文件,就可以运行 。省了每次都去命令行敲了。新建一个sh文件。我是在ubuntu写的。
关键点,就是用到了。redis-cli --pipe 这个redis官方提供的管道命令。使用ta来进行数据传入导入。这是官方网址Redis Mass Insertion – Redis 可以看下。redis 的hkey,hval 说好像可以存50多亿个键值对。啊, 行吧!演示下我的导入数据结果。数据库里,我放了account的账户表,里面有三条数据。在ubuntu控制台,用root用户执行,我们上面写的shell。显示了replies:3说明成功导入了三条数据。打开redis,查看下
ok了,这就没有问题。数据成功导入进来了。
如今开发使用redis都是异步的。所以侧重点,多了解一下关于redis异步的写入读取,阻塞同步下会有什么问题。