示例場景:存儲遊戲玩家的任務數據,遊戲服務器啟動時將mysql中的玩家數據同步到redis。
將MySQL中的數據導入Redis的哈希結構。當然,最直接的方法是遍歷MySQL數據,壹個壹個地寫入Redis。這個沒毛病,但是速度會很慢。如果能想辦法讓MySQL查詢輸出數據直接和Redis命令行的輸入數據協議壹致,就能節省很多消耗,縮短時間。
Mysql數據庫名為:GAME_DB,表結構為例:
創建表TABLE_MISSION(
playerId int(11)unsigned NOT NULL
missionList varchar(255)不為空,
主鍵(playerId)
);
Redis中的數據結構使用哈希表:
KEY key是mission,hash字段是mysql中對應的playerId,hash值是mysql中對應的missionList。數據如下:
[root@iZ23zcsdouzZ ~]# redis-cli
127.0.0.1:6379 >hget任務36598
" { \ " 10001 \ ":{ \ " status \ ":1,\"progress\":0},\ " 10002 \ ":{ \ " status \ ":1,\"progress\":0},\ " 10003 \ ":{ \ " status \ ":1,\ "progress\":0},\ " 1004 \ ":{ \ "
快速同步方法:
創建新後綴。sql文件:mysql2redis_mission.sql
內容如下:
選擇串聯(
" *4\r\n ",
$ ',LENGTH(redis_cmd),' \r\n ',
redis_cmd,' \r\n ',
$ ',LENGTH(redis_key),' \r\n ',
redis_key,' \r\n ',
$ ',長度(hkey),' \r\n ',
hkey,' \r\n ',
$ ',長度(hval),' \r\n ',
hval,' \r '
)
來自(
挑選
HSET作為redis_cmd,
代表團作為redis_key,
playerId為hkey,
傳教士
來自表格_任務
)作為t
創建shell腳本mysql2redis_mission.sh
內容:
MySQL GAME _ d b-skip-column-names-raw & lt;mission.sql | redis-cli - pipe
Linux系統終端可以執行shell腳本或者直接運行系統命令,從而將mysql數據庫GAME_DB的TABLE_MISSION數據同步到redis中的關鍵任務。mysql2redis_mission.sql文件將mysql數據的輸出數據格式與redis的輸入數據格式協議相匹配,大大縮短了同步時間。
經過測試,取出單個文件,修改數據格式,將相同的數據同步寫入redis需要5分鐘。使用上面的sql文件和shell命令,同步數據只需要大約3秒鐘。