使用 python 查询 MySQL 数据并写入 redis

本文介绍了一种将MySQL中的特定数据迁移到Redis的方法,并通过Python脚本实现了这一过程。脚本连接MySQL数据库,读取指定站点UUID的数据,然后将处理后的数据写入Redis中。
import json
import os
import sys
import MySQLdb
import redis
import hashlib

reload(sys)
sys.setdefaultencoding('utf-8')

class mysql2redis():
	def __init__(self, mysqlip, mysqluser, mysqlpwd, redisip, redisauth):
		self.mysqlip = mysqlip
		self.mysqluser = mysqluser
		self.mysqlpwd = mysqlpwd
		self.redisip = redisip
		self.redisauth = redisauth

	def domain2md5(self, domains):
		for domain in domains:
			m = hashlib.md5()
			m.update(domain)
			self.domain = domain
			self.read4mysql(m.hexdigest())

	def read4mysql(self, site_uuid):
		print("%s processing..." % self.domain)
		db = MySQLdb.connect(self.mysqlip, self.mysqluser, self.mysqlpwd, "lxserver")
		cursor = db.cursor()
		sql = """SELECT a.reply_type,a.module,b.parent_key,a.user_id,a.type,a.site_uuid,b.connect_key,a.`mode`,a.has_get_file,
		a.city,a.ip,a.create_time,a.is_connect,a.area,a.root_path,a.`name`,a.connect_url,a.province,a.site_id,a.industry_id,a.harm_level,b.rc4_key 
		FROM lx_site a,lx_user b WHERE a.site_uuid = '%s' AND a.user_id = b.user_id""" % site_uuid
		cursor.execute(sql)
		data = cursor.fetchall()
		self.processData(data)
		db.close()

	def processData(self, data):
		for row in data:
			siteid = row[18]
			v = "{'replyType':%s,'module':'%s','parentKey':'%s','userid':%s,'type':'%s','siteUuid':'%s','connectkey':'%s','mode':%s,'hasgetfile':%s,'city':'%s','ip':'%s','createtime':%s,'isconnect':%s,'area':'%s','rootpath':'%s','name':'%s','connecturl':'%s','province':'%s','siteid':'%s','industryid':%s,'harmlevel':%s,'rc4key':'%s'}" % (row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7],row[8],row[9],row[10],row[11],row[12],row[13],row[14],row[15],row[16],row[17],row[18],row[19],row[20],row[21])
			value = json.dumps(v, ensure_ascii=False)
			is_connect = row[12]
			self.write2redis(siteid, is_connect, value)
		print("%s OK" % self.domain)

	def write2redis(self, siteid, score, value):
		#print(siteid)
		#print(score)
		#print(value)
		pool = redis.ConnectionPool(host = self.redisip, port = 6379, password = self.redisauth)
		r = redis.Redis(connection_pool = pool)
		dic = {siteid:value}
		#r.hmset("lxsitehashin", dic)
		#r.zadd("lxsitesetin", score, siteid)

if __name__ == '__main__':
	domains = ['http://aa.com','http://bb.com','http://cc.com','http://dd.com','http://ee.com','http://ff.com']
	mysqlip = "mysql.*.iaiot.com"
	mysqluser = "root"
	mysqlpwd = "rootpwd"
	redisip = "127.0.0.1"
	redisauth = "redispwd"
	mysql2redis(mysqlip, mysqluser, mysqlpwd, redisip, redisauth).domain2md5(domains)

os.system("pause")

https://blog.iaiot.com/mysql-python-redis.html

MySQL 数据直接写入 Redis 不是一种推荐的做法,主要原因涉及数据一致性、性能优化以及架构设计等多个方面。 首先,MySQLRedis 的设计目标和使用场景存在本质差异。MySQL 是关系型数据库,适用于需要强一致性、复杂查询和事务支持的场景;而 Redis 是内存数据库,主要作为缓存或实时数据处理的存储系统。将 MySQL 数据直接写入 Redis 会违背它们各自的职责工,导致系统设计混乱,难以维护和扩展[^2]。 其次,数据一致性是关键问题之一。如果每次 MySQL 数据变更都同步写入 Redis,系统必须处理网络延迟、写入失败等异常情况。否则,RedisMySQL 之间的数据可能不一致,进而影响业务逻辑。为保证一致性,通常需要引入事务机制或布式锁,这会增加系统复杂度降低性能[^1]。 再者,频繁写入 Redis 会增加其负载,尤其是在数据量大、写入频率高的场景下。Redis 虽然性能优异,但其基于内存的特性决定了存储成本较高。如果将所有 MySQL 数据写入 Redis,不仅浪费内存资源,还可能影响 Redis 的响应速度,进而影响整体系统性能[^3]。 此外,Redis 本身不擅长处理复杂查询和事务操作。即使将 MySQL 数据写入 Redis,也无法实现 MySQL 提供的完整功能。因此,在需要复杂查询和事务支持的场景下,Redis 无法替代 MySQL,直接写入 Redis 可能会导致功能缺失或性能瓶颈[^2]。 最后,从架构设计的角度来看,Redis 更适合作为 MySQL 的缓存层,而非数据主存储。通过缓存热点数据,可以有效减轻 MySQL 的压力,提高系统响应速度。同时,采用异步更新机制(如消息队列)可以降低系统耦合度,提高稳定性和可扩展性[^1]。 ### 数据一致性处理示例 在实际应用中,可以通过监听 MySQL 的 Binlog 实现 Redis 的异步更新: ```python # 示例:监听 MySQL Binlog 更新 Redis def on_binlog_event(event): if event.type == 'UPDATE': redis_client.set(event.key, event.value) elif event.type == 'DELETE': redis_client.delete(event.key) ``` 该方式通过异步机制降低系统耦合度,同时确保数据最终一致性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值