从Python\+MySQL到Redis:非关系型数据库详解(PyCharm实操版)

张开发
2026/4/10 13:36:43 15 分钟阅读

分享文章

从Python\+MySQL到Redis:非关系型数据库详解(PyCharm实操版)
作为已经掌握Python语言和MySQL关系型数据库的开发者当你面临“高并发、快响应”的场景时一定会发现MySQL的局限性——比如频繁查询热点数据时响应速度变慢、数据库压力剧增。这时候非关系型数据库Redis就成了最佳搭档。本文将从Redis基础概念入手重点讲解如何在PyCharm中操作Redis结合Python代码实现常用功能同时对比Redis与MySQL的差异帮你快速上手这个“高性能缓存神器”无缝衔接你已有的技术栈。一、什么是RedisRedisRemote Dictionary Server远程字典服务是一款开源的非关系型数据库NoSQL核心特点是“基于内存存储”也就是说数据主要存在内存中而非像MySQL那样存在硬盘里——这也是它比MySQL快几十倍、上百倍的核心原因。1.1 Redis与MySQL的核心区别你已经熟悉MySQL关系型数据库我们用一张表快速区分两者避免混淆对比维度MySQL关系型Redis非关系型存储位置主要存硬盘持久化主要存内存可配置持久化数据结构二维表行列需提前建表键值对key-value支持多种数据类型字符串、列表、哈希等无需建表核心优势支持事务、复杂SQL查询、海量数据持久化高并发、超快速毫秒级响应、支持缓存、分布式锁等特殊场景适用场景核心业务数据存储用户、订单、商品等热点数据缓存、会话存储、排行榜、限流等简单总结MySQL管“安全存储”Redis管“快速访问”两者搭配使用比如Redis缓存MySQL的热点数据是企业开发中最常见的架构组合。1.2 Redis的核心特点为什么要用它速度极快内存读写响应时间通常在1-10毫秒比MySQL快50-100倍支持多种数据类型不止字符串还有列表、哈希、集合、有序集合能满足更多场景可持久化虽然数据在内存但能配置将数据同步到硬盘避免断电丢失支持分布式可部署多个Redis节点应对高并发场景后续可拓展轻量易用安装简单API简洁结合Python操作门槛极低。1. 3 Redis的应用场景缓存系统减轻数据库压力提升系统性能计数器如网站访问量、点赞数等消息队列利用列表类型实现简单的消息队列排行榜利用有序集合实现各种排行榜功能会话存储存储用户会话信息二、前置准备Redis安装 PyCharm环境配置2.1 Redis安装直接通过小P安装也可以通过命令安装# 安装 redis-pypipinstallredis2. 2 pycharm配置2.3 验证安装安装完成后可以在命令提示窗通过以下命令测试Redis是否正常工作# 连接 Redis 客户端redis-cli# 在 Redis 客户端中测试127.0.0.1:6379pingPONG127.0.0.1:6379settestnihaoOK127.0.0.1:6379gettestnihao127.0.0.1:6379exit三、PyCharm中操作Redis核心用法Python代码实现Redis的核心是“键值对key-value”我们结合Python代码讲解最常用的5种数据类型操作每一种都对应实际开发场景结合你熟悉的Python语法一看就会。3.1 字符串String最基础的键值对类似Python的字典适用场景存储单个值比如验证码、用户名、热点商品名称对应MySQL中的单字段存储。importredis# 1. 建立连接后续代码可复用这个连接rredis.Redis(hostlocalhost,# 本地Redis地址远程则填服务器IPport6379,# Redis默认端口db0,# Redis默认有16个数据库编号0-15可切换decode_responsesTrue# 自动将返回的bytes类型转为字符串避免每次decode)# 2. 字符串操作r.set(username,zhangsan)# 设置键值对keyusernamevaluezhangsanr.setex(code,60,123456)# 设置带过期时间的键值对60秒后过期适合验证码print(r.get(username))# 读取值输出zhangsanprint(r.exists(code))# 判断键是否存在输出True过期后为Falser.delete(username)# 删除键print(r.get(username))# 键不存在输出None3.2 哈希Hash适合存储对象类似Python的字典嵌套适用场景存储一个对象的多个属性比如用户信息、商品信息对应MySQL中的一行数据多列但无需建表。# 哈希操作存储用户信息r.hset(user:1001,mapping{# keyuser:1001规范表名:主键value是字典id:1001,name:李四,age:25,gender:男})# 读取哈希中的单个字段print(r.hget(user:1001,name))# 输出李四# 读取哈希中的所有字段和值print(r.hgetall(user:1001))# 输出{id: 1001, name: 李四, age: 25, gender: 男}# 删除哈希中的某个字段r.hdel(user:1001,age)print(r.hgetall(user:1001))# 输出{id: 1001, name: 李四, gender: 男}3.3 列表List有序可重复类似Python的列表适用场景存储有序数据比如消息队列、最新消息列表、分页数据。# 列表操作存储消息列表r.lpush(message,第一条消息)# 从列表左侧添加元素r.lpush(message,第二条消息)r.rpush(message,第三条消息)# 从列表右侧添加元素# 读取列表中的所有元素print(r.lrange(message,0,-1))# 输出[第二条消息, 第一条消息, 第三条消息]# 弹出列表元素左侧弹出弹出后元素消失print(r.lpop(message))# 输出第二条消息print(r.lrange(message,0,-1))# 输出[第一条消息, 第三条消息]3.4 集合Set无序不可重复类似Python的集合适用场景去重操作比如用户标签、点赞用户列表。# 集合操作存储用户标签不可重复r.sadd(user:1001:tags,Python,MySQL,Redis)# 添加多个元素r.sadd(user:1001:tags,Python)# 重复添加不会生效# 读取集合中的所有元素print(r.smembers(user:1001:tags))# 输出{Python, MySQL, Redis}无序# 判断元素是否在集合中print(r.sismember(user:1001:tags,Java))# 输出False# 删除集合中的元素r.srem(user:1001:tags,MySQL)print(r.smembers(user:1001:tags))# 输出{Python, Redis}3.5 有序集合Sorted Set有序不可重复带分数排序适用场景排行榜比如用户积分排行榜、商品销量排行榜这是MySQL实现起来很麻烦但Redis很轻松的场景。# 有序集合操作用户积分排行榜r.zadd(user:ranking,{zhangsan:80,lisi:95,wangwu:75})# key排行榜名称value是字典用户:积分积分作为排序依据# 按积分升序排列从低到高print(r.zrange(user:ranking,0,-1,withscoresTrue))# 输出[(wangwu, 75.0), (zhangsan, 80.0), (lisi, 95.0)]# 按积分降序排列从高到低最常用print(r.zrevrange(user:ranking,0,-1,withscoresTrue))# 输出[(lisi, 95.0), (zhangsan, 80.0), (wangwu, 75.0)]# 获取某个用户的排名降序排名从0开始print(r.zrevrank(user:ranking,zhangsan))# 输出1第二名四、Redis与PythonMySQL的结合使用实战场景你已经掌握了Python和MySQL现在结合Redis实现一个最常见的实战场景用Redis缓存MySQL的热点数据减轻MySQL压力提升接口响应速度。核心逻辑查询数据时先查Redis如果Redis有数据命中直接返回如果没有未命中查MySQL再把数据存入Redis下次查询直接用Redis。importredisimportpymysql# 1. 连接Redisrredis.Redis(hostlocalhost,port6379,db0,decode_responsesTrue)# 2. 连接MySQL你已熟悉的代码connpymysql.connect(hostlocalhost,userroot,password你的MySQL密码,database你的数据库名,charsetutf8mb4)cursorconn.cursor(pymysql.cursors.DictCursor)# 3. 实战查询用户信息用Redis缓存defget_user_info(user_id):# 第一步先查Redisuser_keyfuser:{user_id}user_infor.hgetall(user_key)ifuser_info:# Redis命中直接返回数据print(从Redis获取数据)returnuser_info# 第二步Redis未命中查MySQLsqlfselect id, name, age, gender from user where id {user_id}cursor.execute(sql)user_infocursor.fetchone()ifuser_info:# 把MySQL查询到的数据存入Redis方便下次查询r.hset(user_key,mappinguser_info)# 设置过期时间300秒避免数据长期缓存导致与MySQL不一致r.expire(user_key,300)print(从MySQL获取数据并存入Redis)else:print(用户不存在)returnuser_info# 测试第一次查MySQL第二次查Redisprint(get_user_info(1001))# 输出从MySQL获取数据并存入Redis 用户信息print(get_user_info(1001))# 输出从Redis获取数据 用户信息# 关闭连接cursor.close()conn.close()注意当MySQL中的数据被修改比如用户更新姓名需要同步删除Redis中的对应缓存否则会出现“缓存与数据库不一致”的问题后续可拓展讲解。五、常见问题与避坑指南结合你的报错5.1 报错Driver class #39;jdbc.RedisDriver#39; is incompatible with current JRE原因你在PyCharm的“Database”面板用于连接MySQL等关系型数据库中试图用JDBC驱动连接Redis但Redis不是关系型数据库不支持JDBC协议没有jdbc.RedisDriver这个驱动。解决放弃用Database面板连Redis按本文“2.2节”配置用Python的redis库操作或安装PyCharm的Redis可视化插件比如Iedis、Redis Explorer。5.2 报错Connection refused: connect原因Redis服务未启动或连接地址、端口错误。解决1. 启动Redis服务cmd运行redis-server.exe redis.windows.conf2. 检查代码中host本地填localhost、port默认6379是否正确。5.3 数据存入Redis后重启Redis就消失了原因Redis默认是“内存存储”断电或重启服务后内存中的数据会丢失。解决配置Redis持久化简单配置打开Redis解压目录的redis.windows.conf找到appendonly yes取消注释保存后重启Redis数据会同步到硬盘。六、总结与后续学习方向作为PythonMySQL开发者Redis是你提升技术栈的“必备工具”——它不复杂核心就是“内存级键值对存储”解决MySQL高并发读的痛点。本文重点讲解了Redis的基础概念、PyCharm实操、核心用法以及与MySQL的结合你可以先掌握这些基础后续再拓展Redis持久化RDB vs AOF确保数据不丢失缓存问题穿透、击穿、雪崩企业面试高频考点Redis分布式锁解决多线程/多服务并发问题Redis集群应对海量数据和更高并发。Redis的学习成本很低结合你已有的Python和MySQL基础多写几行代码实操很快就能上手后续开发中遇到高并发场景就能轻松应对啦

更多文章