当前位置: 首页 > news >正文

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

作为已经掌握Python语言和MySQL关系型数据库的开发者,当你面临“高并发、快响应”的场景时,一定会发现MySQL的局限性——比如频繁查询热点数据时,响应速度变慢、数据库压力剧增。这时候,非关系型数据库Redis就成了最佳搭档。

本文将从Redis基础概念入手,重点讲解如何在PyCharm中操作Redis,结合Python代码实现常用功能,同时对比Redis与MySQL的差异,帮你快速上手这个“高性能缓存神器”,无缝衔接你已有的技术栈。

一、什么是Redis?

Redis(Remote 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-pypipinstallredis

2. 2 pycharm配置




2.3 验证安装

安装完成后,可以在命令提示窗,通过以下命令测试Redis是否正常工作

# 连接 Redis 客户端redis-cli# 在 Redis 客户端中测试127.0.0.1:6379>pingPONG127.0.0.1:6379>settest"nihao"OK127.0.0.1:6379>gettest"nihao"127.0.0.1:6379>exit

三、PyCharm中操作Redis:核心用法(Python代码实现)

Redis的核心是“键值对(key-value)”,我们结合Python代码,讲解最常用的5种数据类型操作,每一种都对应实际开发场景,结合你熟悉的Python语法,一看就会。

3.1 字符串(String):最基础的键值对(类似Python的字典)

适用场景:存储单个值(比如验证码、用户名、热点商品名称),对应MySQL中的单字段存储。

importredis# 1. 建立连接(后续代码可复用这个连接)r=redis.Redis(host='localhost',# 本地Redis地址,远程则填服务器IPport=6379,# Redis默认端口db=0,# Redis默认有16个数据库,编号0-15,可切换decode_responses=True# 自动将返回的bytes类型转为字符串,避免每次decode)# 2. 字符串操作r.set('username','zhangsan')# 设置键值对(key=username,value=zhangsan)r.setex('code',60,'123456')# 设置带过期时间的键值对(60秒后过期,适合验证码)print(r.get('username'))# 读取值,输出:zhangsanprint(r.exists('code'))# 判断键是否存在,输出:True(过期后为False)r.delete('username')# 删除键print(r.get('username'))# 键不存在,输出:None

3.2 哈希(Hash):适合存储对象(类似Python的字典嵌套)

适用场景:存储一个对象的多个属性(比如用户信息、商品信息),对应MySQL中的一行数据(多列),但无需建表。

# 哈希操作:存储用户信息r.hset('user:1001',mapping={# key=user: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,withscores=True))# 输出:[('wangwu', 75.0), ('zhangsan', 80.0), ('lisi', 95.0)]# 按积分降序排列(从高到低,最常用)print(r.zrevrange('user:ranking',0,-1,withscores=True))# 输出:[('lisi', 95.0), ('zhangsan', 80.0), ('wangwu', 75.0)]# 获取某个用户的排名(降序,排名从0开始)print(r.zrevrank('user:ranking','zhangsan'))# 输出:1(第二名)

四、Redis与Python+MySQL的结合使用(实战场景)

你已经掌握了Python和MySQL,现在结合Redis,实现一个最常见的实战场景:用Redis缓存MySQL的热点数据,减轻MySQL压力,提升接口响应速度。

核心逻辑:查询数据时,先查Redis;如果Redis有数据(命中),直接返回;如果没有(未命中),查MySQL,再把数据存入Redis,下次查询直接用Redis。

importredisimportpymysql# 1. 连接Redisr=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)# 2. 连接MySQL(你已熟悉的代码)conn=pymysql.connect(host='localhost',user='root',password='你的MySQL密码',database='你的数据库名',charset='utf8mb4')cursor=conn.cursor(pymysql.cursors.DictCursor)# 3. 实战:查询用户信息(用Redis缓存)defget_user_info(user_id):# 第一步:先查Redisuser_key=f'user:{user_id}'user_info=r.hgetall(user_key)ifuser_info:# Redis命中,直接返回数据print('从Redis获取数据')returnuser_info# 第二步:Redis未命中,查MySQLsql=f"select id, name, age, gender from user where id ={user_id}"cursor.execute(sql)user_info=cursor.fetchone()ifuser_info:# 把MySQL查询到的数据存入Redis,方便下次查询r.hset(user_key,mapping=user_info)# 设置过期时间(300秒),避免数据长期缓存导致与MySQL不一致r.expire(user_key,300)print('从MySQL获取数据,并存入Redis')else:print('用户不存在')returnuser_info# 测试(第一次查MySQL,第二次查Redis)print(get_user_info(1001))# 输出:从MySQL获取数据,并存入Redis + 用户信息print(get_user_info(1001))# 输出:从Redis获取数据 + 用户信息# 关闭连接cursor.close()conn.close()

注意:当MySQL中的数据被修改(比如用户更新姓名),需要同步删除Redis中的对应缓存,否则会出现“缓存与数据库不一致”的问题(后续可拓展讲解)。

五、常见问题与避坑指南(结合你的报错)

5.1 报错:Driver class 'jdbc.RedisDriver' 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.conf);2. 检查代码中host(本地填localhost)、port(默认6379)是否正确。

5.3 数据存入Redis后,重启Redis就消失了?

原因:Redis默认是“内存存储”,断电或重启服务后,内存中的数据会丢失。

解决:配置Redis持久化(简单配置:打开Redis解压目录的redis.windows.conf,找到appendonly yes,取消注释,保存后重启Redis,数据会同步到硬盘)。

六、总结与后续学习方向

作为Python+MySQL开发者,Redis是你提升技术栈的“必备工具”——它不复杂,核心就是“内存级键值对存储”,解决MySQL高并发读的痛点。

本文重点讲解了Redis的基础概念、PyCharm实操、核心用法,以及与MySQL的结合,你可以先掌握这些基础,后续再拓展:

  • Redis持久化(RDB vs AOF):确保数据不丢失;

  • 缓存问题(穿透、击穿、雪崩):企业面试高频考点;

  • Redis分布式锁:解决多线程/多服务并发问题;

  • Redis集群:应对海量数据和更高并发。

Redis的学习成本很低,结合你已有的Python和MySQL基础,多写几行代码实操,很快就能上手,后续开发中遇到高并发场景,就能轻松应对啦!

http://www.jsqmd.com/news/618351/

相关文章:

  • 细聊石墨配件批发生产厂,选哪家更能满足定制需求? - 工业设备
  • 2026年护理床选购指南:教你3招挑选高性价比病床 - 精选优质企业推荐榜
  • 2026普通人转行,推荐一个好就业的方向——人工智能大模型
  • 别再被公私钥搞晕了!支付宝Python SDK配置中最容易出错的几个细节(附最新网关)
  • 郭老师-越善良的人,越懂得无情
  • 深入解析NCSI协议:从BMC与MAC通信看网络协议设计精髓
  • 2026年教育行业AI客服平台推荐,机构培训学校在线客服系统哪家好 - 品牌2026
  • 2026年AI软件设计工具全景指南:6款主流产品横向对比
  • BepInEx插件框架:5分钟学会为Unity游戏注入无限可能
  • 手把手教你用YOLOv5训练自己的叶片病虫害检测模型(附5493张数据集)
  • Kafka-King深度解析:现代Kafka管理平台的技术架构与工程实践
  • 骨质疏松补剂品牌推荐:从预防到改善,2026补剂选择一文读懂 - 速递信息
  • 终极指南:3个技巧让Foobar2000完美支持KRC、QRC、YRC逐字歌词
  • 2026年长沙病床选购指南:5步挑对高性价比护理床 - 精选优质企业推荐榜
  • 终极Kobo阅读体验:如何用Kepubify快速转换EPUB电子书格式
  • 从产线到报废场:揭秘汽车电子‘黑匣子’数据如何被0x22服务全程追踪(附DID分类指南)
  • ArcGIS Pro 3.4实战:用协同克里金法提升气温预测精度(含DEM数据融合)
  • 常用的FSK/FM/AM调制波形
  • 如何为百度网盘macOS版解锁20倍下载速度:非会员的终极解决方案
  • 5分钟搞定Realtek 8192FU无线网卡:Linux驱动终极安装指南
  • unity开发vive的串流和quest的串流有冲突要卸载其中一个
  • 从青铜到王者:一份硬核ACM算法修炼图谱
  • 避坑指南:树莓派USB摄像头常见报错大全(含libjpeg8-dev/motion配置/SSH-Y转发等问题解决方案)
  • 告别驱动焦虑:手把手教你为Ubuntu 22.04下的A800显卡选择并锁定最佳NVIDIA驱动版本
  • 长春洪科家电维修:长春科龙空调 TCL空调 长虹空调维修电话 - LYL仔仔
  • 终极macOS菜单栏管理指南:如何用Ice让你的Mac工作区整洁如新
  • VMware虚拟机安装教程:Qwen3-TTS开发环境配置
  • Behdad字体技术深度解析:波斯语开源字体的现代化实现方案
  • Loom迁移避坑清单,深度剖析12个导致CPU飙升、线程泄漏与上下文丢失的致命陷阱
  • Python实战:构建基于Django+Vue的恶意流量检测与靶场学习平台