工作中有這樣一個需求,要將用戶的魅力值數據做排行,生成榜單展示前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分鍾跑完了,很快而且准確。