将mysql表数据批量导入redis zset结构中

时间:2022-03-17 14:53:17

       工作中有这样一个需求,要将用户的魅力值数据做排行,生成榜单展示前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.2.3 -uskst -p'password' nyx  --skip-column-names --raw < data.sql |/usr/local/redis/bin/redis-cli -h 192.168.2.128 -p 6479 --pipe

前提:在一台装有mysql服务和redis服务的linux环境下

mysql -h"源数据库ip" -u"用户名" -p"密码" 数据库名 --skip-column-names --raw < data.sql(后面给出)|/usr/local/redis/bin/redis-cli -h "目标redis的ip"

-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分钟跑完了,很快而且准确。