• 快速同步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
    ",
      '$', LENGTH(redis_cmd), '
    ',
      redis_cmd, '
    ',
      '$', LENGTH(redis_key), '
    ',
      redis_key, '
    ',
      '$', LENGTH(hkey), '
    ',
      hkey, '
    ',
      '$', LENGTH(hval), '
    ',
      hval, '
    '
    )
    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左右。

  • 相关阅读:
    玩转xss
    Anonim小白成长计划
    mssql注入与绕过
    了解mssql数据库
    2020年度学习规划
    access 注入
    bypasswaf 之报错注入
    bypasswaf之盲注
    sql注入常用函数与bypasswaf
    一篇关于数据库的另类操作
  • 原文地址:https://www.cnblogs.com/Buggo/p/5550358.html
Copyright © 2020-2023  润新知