哈哈……怎样将mysql表数据批量导入redis中

工作中有这样一个需求,要将用户的魅力值数据做排行,生成榜单展示前40名,每隔5分钟刷新一次榜单。这样的需求用redis的zset是很方便实现的。但是数据存在mysql的表中,有400多万条,怎么将其快速的放入redis中呢?
一般我们想到是通过程序把数据从mysql中查出来,然后存入redis,但是这样不仅耗时,而且不能保证写入redis的数据的准确性,这中间存在一个部署的时差。通过google老师一查原来redis提供了批量导入数据的功能,原帖地址:

http://baijian.github.io/2013/10/12/import-data-from-mysql-to-redis.html

  下面贴出脚本和我的一些理解:
mysql -h192.168.1.3 -uskst -p'password' nyx  --
skip-column-names --raw < data.sql |/usr/local/redis/bin/redis-cli -h 192.168.1.2 -p 6479 --pipe

mysql -h"源数据库ip" -u"用户名" -p"密码"数据库名 --skip-column-names --raw < data.sql(后面给出)|/usr/local/redis/bin/redis-cli -h "目标redis的ip"前提:在一台装有mysql服务和redis服务的linux环境下-p "目标redis端口" --pipe

以上脚本很好理解,下面给出data.sql中的脚本:

SELECT CONCAT(
    '*4\r\n',
    '$',LENGTH(redis_cmd),'\r\n',redis_cmd,'\r\n',
    '$',LENGTH(redis_key),'\r\n',redis_key,'\r\n',
    '$',LENGTH(redis_increment),'\r\n',redis_increment,'\r\n',
    '$',LENGTH(redis_member),'\r\n',redis_member,'\r'
) FROM (
    SELECT 'ZADD' as redis_cmd,
'charmRank:forever:2015-07-14 00:00:00_2050-12-30 23:59:59' as redis_key,
    charm as redis_increment,
    accountId as redis_member 
    FROM table_name 
) AS name

这个脚本中:开头4是指该redis命令有几个部分,比如我的zadd key score member命令有4部分, 如果是 ZSCORE key member 那么就是3,其他部分应该都好懂。

整个命令执行下来400多万数据不到1分钟跑完了,很快而且准确。

非特殊说明,本博所有文章均为博主原创。

备注:相关侵权、举报、投诉及建议等,请联系站长

添加新评论

昵称
邮箱
网站