標籤:
工作中有這樣一個需求,要將使用者的魅力值資料做排行,產生榜單展示前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分鐘跑完了,很快而且準確。
將mysql表資料大量匯入redis zset結構中