从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安装


也可以通过命令安装

bash 复制代码
# 安装 redis-py
pip install redis

2. 2 pycharm配置




2.3 验证安装

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

bash 复制代码
# 连接 Redis 客户端
redis-cli

# 在 Redis 客户端中测试
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set test "nihao"
OK
127.0.0.1:6379> get test
"nihao"
127.0.0.1:6379> exit

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

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

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

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

python 复制代码
import redis

# 1. 建立连接(后续代码可复用这个连接)
r = redis.Redis(
    host='localhost',  # 本地Redis地址,远程则填服务器IP
    port=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'))        # 读取值,输出:zhangsan
print(r.exists('code'))         # 判断键是否存在,输出:True(过期后为False)
r.delete('username')            # 删除键
print(r.get('username'))        # 键不存在,输出:None

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

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

python 复制代码
# 哈希操作:存储用户信息
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的列表

适用场景:存储有序数据(比如消息队列、最新消息列表、分页数据)。

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的集合

适用场景:去重操作(比如用户标签、点赞用户列表)。

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很轻松的场景。

python 复制代码
# 有序集合操作:用户积分排行榜
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。

python 复制代码
import redis
import pymysql

# 1. 连接Redis
r = 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缓存)
def get_user_info(user_id):
    # 第一步:先查Redis
    user_key = f'user:{user_id}'
    user_info = r.hgetall(user_key)
    
    if user_info:
        # Redis命中,直接返回数据
        print('从Redis获取数据')
        return user_info
    
    # 第二步:Redis未命中,查MySQL
    sql = f"select id, name, age, gender from user where id = {user_id}"
    cursor.execute(sql)
    user_info = cursor.fetchone()
    
    if user_info:
        # 把MySQL查询到的数据存入Redis,方便下次查询
        r.hset(user_key, mapping=user_info)
        # 设置过期时间(300秒),避免数据长期缓存导致与MySQL不一致
        r.expire(user_key, 300)
        print('从MySQL获取数据,并存入Redis')
    else:
        print('用户不存在')
    
    return user_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基础,多写几行代码实操,很快就能上手,后续开发中遇到高并发场景,就能轻松应对啦!

相关推荐
ZhengEnCi1 天前
P2E-Python字典操作完全指南-从增删改查到遍历嵌套的Python编程利器
python
alanesnape1 天前
使用AVL平衡树和列表实现 map容器 -- 附加测试/python代码
python·map·avl 平衡树·bst树·二叉树旋转
卤炖阑尾炎1 天前
Python 网络编程实战:从 TCP/UDP 基础到高并发服务器开发
网络·python·tcp/ip
weixin_513449961 天前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
飞Link1 天前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
曾阿伦1 天前
Python3 文件 (夹) 操作备忘录
开发语言·python
a里啊里啊1 天前
Redis面试题记录
数据库·redis·缓存
数据知道1 天前
claw-code 源码分析:OmX `$team` / `$ralph`——把 AI 辅助开发从偶发灵感变成可重复流水线
数据库·人工智能·mysql·ai·claude code·claw code
__土块__1 天前
大厂后端一面模拟:从线程安全到分布式缓存的连环追问
jvm·redis·mysql·spring·java面试·concurrenthashmap·大厂后端
架构师老Y1 天前
006、异步编程与并发模型:asyncio与高性能后端
python