將mysql表數據批量導入redis zset結構中


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM