快速同步mysql數據到redis中


MYSQL快速同步數據到Redis

舉例場景:存儲游戲玩家的任務數據,游戲服務器啟動時將mysql中玩家的數據同步到redis中。

從MySQL中將數據導入到Redis的Hash結構中。當然,最直接的做法就是遍歷MySQL數據,一條一條寫入到Redis中。這樣沒什么錯,但是速度會非常慢。如果能夠想法使得MySQL的查詢輸出數據直接能夠與Redis命令行的輸入數據協議相吻合,可以節省很多消耗和縮短時間。

Mysql數據庫名稱為:GAME_DB, 表結構舉例:

CREATE TABLE TABLE_MISSION (
    playerId int(11) unsigned NOT NULL,
    missionList varchar(255) NOT NULL,
    PRIMARY KEY (playerId)
);

Redis中的數據結構使用哈希表:

鍵KEY為mission, 哈希域為mysql中對應的playerId, 哈希值為mysql中對應的missionList。 數據如下:

[root@iZ23zcsdouzZ ~]# redis-cli
127.0.0.1:6379> hget missions 36598
"{\"10001\":{\"status\":1,\"progress\":0},\"10002\":{\"status\":1,\"progress\":0},\"10003\":{\"status\":1,\"progress\":0},\"10004\":{\"status\":1,\"progress\":0}}"

快速同步方法:

新建一個后綴.sql文件:mysql2redis_mission.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(hkey), '\r\n',
  hkey, '\r\n',
  '$', LENGTH(hval), '\r\n',
  hval, '\r'
)
FROM (
  SELECT
  'HSET' as redis_cmd,
  'missions' AS redis_key,
  playerId AS hkey,
  missionList AS hval
  FROM TABLE_MISSION
) AS t

創建shell腳本mysql2redis_mission.sh
內容:

mysql GAME_DB --skip-column-names --raw < mission.sql | redis-cli --pipe

Linux系統終端執行該shell腳本或者直接運行該系統命令,即可將mysql數據庫GAME_DB的表TABLE_MISSION數據同步到redis中鍵missions中去。mysql2redis_mission.sql文件就是將mysql數據的輸出數據格式和redis的輸入數據格式協議相匹配,從而大大縮短了同步時間。

經過測試,同樣一份數據通過單條取出修改數據格式同步寫入到redis消耗的時間為5min, 使用上面的sql文件和shell命令,同步完數據僅耗時3s左右。


免責聲明!

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



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