问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

使用python同步mysql到redis?由于数据较多,一条一条读出来写到redis太...

发布网友 发布时间:2022-04-24 19:47

我来回答

2个回答

热心网友 时间:2022-04-08 01:24

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左右。追问这个文章我看过,脚本是php,我问的是python。

热心网友 时间:2022-04-08 02:42

import redis
import time
redis = redis.Redis(host='localhost', port=6379, db=0)

s_time = time.time()
with redis.pipeline() as pipe:
    pipe.multi()
    for index,item in item in enumerate(qset):#qset是你查询出来的结果集,
key = item['id']
value = item['name']
ret = pipe.sadd(key, value)

if index % 1000 == 0:
    print "Now cnt: %d" % (i+1)
    pipe.execute()
    pipe.multi()

    print "Execute..."
    pipe.execute()

e_time = time.time()

上面省略了mysql查询代码,而且是以键值对来描述的

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 鸢飞戾天者,望峰息心,经纶世务者,窥谷忘反的实际意思是什么,反应作者怎样的处事思想 mysql的MEMORY引擎为什么应用没有redis的应用广泛 分子式C4H8O2,各峰H面积比A:B:C=3:2:3,请给出结构式,求出推导过程 redis 一次请求耗时多少 mysql 学习java怎么样,前景好吗,好学习吗?哪些培训班比较好? 学习java的培训机构? 如何获取联系人微信? 微信获取openid失败怎么办- 问一问 谁知道有自学日语的好网站? 有没有一些好点的学日语的网站啊, 请问有没有什么比较好的适合日语初学者的网站,谢谢 微信红包金币声怎么设置 有没有比较好的日语学习网站 微信收红包的时为何听不到掉金币的声音? 自学日语的网站有哪些? 网上学日语的网站有哪些? 有没有比较好的日语学习网站? 微信有红包就有铜钱声音怎么设置 所有学习日文的网站 线上学习日语有哪些网站可以选择? 什么是基频,倍频,合频,泛频峰 用redis 做为数据缓存,怎么能把redis中的数据定时更新到mysql中 进入去峰要核酸报告吗? redis相对于mysql有什么劣势,是不是能用redis尽量用 某人爬文笔峰1000级台阶每100级要用5分钟然后歇2分钟这人爬到顶需要多少分钟 天龙八部大小缥缈峰什么属性能过 Redis等缓存数据库为什么访问会比较快 天龙八部之缥缈峰 组频峰?分析化学中提到的词,但不知缘由?问问! 冰箱内部怎样清理 如何清理冰箱内部卫生 有谁清楚清洁冰箱内部污垢妙招? a95屏幕变白,怎么调试 VivoY31S手机屏幕怎么调白 手机变白怎么搞? 新买的冰箱放置2小时后通电了,忽然忘记清除内部卫生,现在断电清洗内部合适吗? 苹果手机微信视频怎么把皮肤调白一点 小米手机怎么变成白色的? 华为手机颜色变暗变白如何调? 渲染的时候用的是 显卡 还是 CPU