news 2026/4/18 15:25:34

Day 63:【99天精通Python】Redis 数据库入门 - 性能加速器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Day 63:【99天精通Python】Redis 数据库入门 - 性能加速器

Day 63:【99天精通Python】Redis 数据库入门 - 性能加速器

前言

欢迎来到第63天!

在前面的课程中,我们使用了 SQLite (SQL) 来存储数据。当数据量较小且读写不频繁时,它很好用。
但是,当你的网站用户量暴增,成千上万的人同时访问首页,或者频繁查询同一个热点数据(比如微博热搜)时,传统的数据库(MySQL/PostgreSQL)会成为瓶颈,因为它们需要频繁地进行磁盘 I/O

Redis (Remote Dictionary Server)是一个基于内存的 NoSQL 数据库。
它的读写速度非常快(每秒可达 10万+ 次),常被用作缓存 (Cache)、消息队列、计数器等。

本节内容:

  • Redis 安装与启动
  • Python 操作 Redis (redis-py)
  • 5 大数据类型 (String, List, Hash, Set, ZSet)
  • 缓存实战:给 Flask 页面加速
  • 过期时间 (TTL) 的妙用

一、Redis 安装与启动

1.1 安装 Redis Server

  • Windows: Redis 官方不支持 Windows,但可以使用微软维护的版本或 Docker。
  • Mac:brew install redis
  • Linux:sudo apt install redis-server

启动服务:

redis-server

1.2 安装 Python 客户端

pipinstallredis

二、Python 连接 Redis

importredis# 1. 建立连接# decode_responses=True: 自动将 bytes 解码为 string (推荐)r=redis.Redis(host='localhost',port=6379,db=0,decode_responses=True)# 2. 测试连接try:response=r.ping()print(f"连接成功:{response}")# Trueexceptredis.ConnectionError:print("连接失败,请检查 Redis 服务是否启动")

三、5 大数据类型详解

Redis 不仅仅是简单的 Key-Value,它的 Value 支持多种结构。

3.1 String (字符串)

最基本类型,可以存文本、JSON、甚至二进制图片。

# 设置值r.set("name","Alice")# 获取值print(r.get("name"))# Alice# 数值操作 (原子递增,适合做点赞数、访问量)r.set("views",100)r.incr("views")print(r.get("views"))# 101

3.2 List (列表)

双向链表,适合做消息队列。

# 从左边推入r.lpush("tasks","task1","task2")# 从右边弹出task=r.rpop("tasks")print(task)# task1# 获取范围 (0到-1表示所有)print(r.lrange("tasks",0,-1))# ['task2']

3.3 Hash (哈希)

类似 Python 的字典,适合存对象。

# 存储用户对象r.hset("user:1001",mapping={"name":"Bob","age":30})# 获取单个字段print(r.hget("user:1001","name"))# Bob# 获取所有字段print(r.hgetall("user:1001"))# {'name': 'Bob', 'age': '30'}

3.4 Set (集合)

无序去重,适合做"共同好友"、“抽奖名单”。

r.sadd("tags","python","coding","python")# 自动去重print(r.smembers("tags"))# {'python', 'coding'}# 集合运算 (交集)r.sadd("tags2","python","java")print(r.sinter("tags","tags2"))# {'python'}

3.5 ZSet (有序集合)

带分数的集合,适合做排行榜。

# 添加 (成员: 分数)r.zadd("ranking",{"Alice":90,"Bob":85,"Charlie":95})# 获取前三名 (按分数倒序)top3=r.zrevrange("ranking",0,2,withscores=True)print(top3)# [('Charlie', 95.0), ('Alice', 90.0), ('Bob', 85.0)]

四、缓存实战:给 Flask 加速

假设我们有一个非常耗时的查询函数(模拟数据库查询)。

importtimefromflaskimportFlaskimportredis app=Flask(__name__)cache=redis.Redis(decode_responses=True)defheavy_db_query(user_id):"""模拟耗时 2 秒的数据库查询"""time.sleep(2)returnf"User Data for{user_id}"@app.route("/user/<user_id>")defget_user(user_id):# 1. 先查缓存cache_key=f"user:{user_id}"data=cache.get(cache_key)ifdata:print("Hit Cache! (命中缓存)")returnf"{data}(来自缓存)"# 2. 缓存没命中,查数据库print("Miss Cache... (查询数据库)")data=heavy_db_query(user_id)# 3. 写入缓存,并设置过期时间 60 秒 (TTL)# ex=60: 60秒后自动删除,防止数据一直不更新cache.set(cache_key,data,ex=60)returnf"{data}(来自数据库)"if__name__=="__main__":app.run(debug=True)

效果

  • 第一次访问/user/1:等待 2 秒,显示"来自数据库"。
  • 第二次访问/user/1:瞬间显示"来自缓存"。
  • 60秒后再访问:缓存失效,重新查库。

五、高级特性:过期时间与持久化

5.1 TTL (Time To Live)

Redis 的每个 Key 都可以设置寿命。

  • expire(key, seconds):设置过期时间。
  • ttl(key):查看剩余时间 (-1 永不过期, -2 已过期)。

5.2 持久化 (RDB vs AOF)

虽然 Redis 是内存数据库,但它也能把数据存到硬盘。

  • RDB (快照):每隔一段时间生成一个.rdb文件。恢复快,但可能丢几分钟数据。
  • AOF (日志):记录每一条写命令。数据安全,但文件体积大,恢复慢。
    通常生产环境会同时开启。

六、常见问题

Q1:Redis 挂了怎么办?

使用Redis Sentinel (哨兵)Redis Cluster (集群)实现高可用。即使主节点挂了,从节点会自动顶上。

Q2:缓存穿透、击穿、雪崩是什么?

面试高频题:

  • 穿透:查一个根本不存在的 key,缓存没命中,数据库也没有(导致一直查库)。
    • 解决:布隆过滤器,或缓存空值。
  • 击穿:一个热点 key 突然过期,大量请求瞬间打到数据库。
    • 解决:加互斥锁,或设置永不过期。
  • 雪崩:大量 key 在同一时间集中过期。
    • 解决:过期时间加随机值。

七、小结

Redis

数据结构

核心功能

应用场景

String (KV/计数)

List (队列)

Hash (对象)

ZSet (排行)

In-Memory (极速)

TTL (自动过期)

Persistence (持久化)

Cache (缓存)

Session 存储

消息中间件

关键要点

  1. 是 Redis 的最大特点,因为它在内存运行。
  2. String, Hash, List, Set, ZSet是 5 大基石。
  3. 缓存是 Redis 最常见的用途,记得设置TTL

八、课后作业

  1. 阅读量统计:编写一个脚本,每次运行相当于访问一次文章。使用 Redis 的incr统计阅读量,并每隔 10 次打印一次当前总数。
  2. 最近浏览记录:使用 Redis 的List(lpush,ltrim) 维护一个用户的最近 5 条浏览记录。即使插入第 6 条,列表长度也始终保持 5 条。
  3. 简单分布式锁 (进阶):查阅setnx(set if not exists) 命令,尝试实现一个简单的分布式锁,保证同一时间只有一个脚本能执行某段代码。

下节预告

Day 64:Celery 异步任务队列- 用户的请求太耗时(如生成报表、发邮件),不想让他等怎么办?明天我们学习如何用 Celery + Redis 把任务丢到后台处理!


系列导航

  • 上一篇:Day 62 - PythonWeb部署
  • 下一篇:Day 64 - 异步任务队列Celery(待更新)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 2:26:39

AI文档扫描仪企业部署:金融行业合规文档处理方案

AI文档扫描仪企业部署&#xff1a;金融行业合规文档处理方案 1. 金融行业文档处理的挑战与需求 1.1 传统文档管理的痛点 在金融行业中&#xff0c;合同、票据、开户资料、审批文件等纸质文档的数字化处理是日常运营的重要环节。传统的文档扫描流程依赖专业设备或人工校正&am…

作者头像 李华
网站建设 2026/4/17 17:51:09

5大理由告诉你为什么Windows自动化测试工具是程序员的必备技能

5大理由告诉你为什么Windows自动化测试工具是程序员的必备技能 【免费下载链接】pywinauto pywinauto/pywinauto: 一个 Python 库&#xff0c;用于自动化 Windows 应用程序。特点是提供了丰富的函数和类库&#xff0c;可以用于控制鼠标、键盘和菜单等元素&#xff0c;实现自动化…

作者头像 李华
网站建设 2026/4/18 2:27:38

快速理解树莓派4b的硬件接口功能

树莓派4B硬件接口全解析&#xff1a;从引脚到系统集成的实战指南你有没有过这样的经历&#xff1f;手握一块树莓派4B&#xff0c;插上电源、接好显示器&#xff0c;却对那一排40针的GPIO束手无策&#xff1b;或者想外接一个高速U盘做NAS&#xff0c;却发现传输速度远不如预期&a…

作者头像 李华
网站建设 2026/4/17 6:15:49

亲测Open Interpreter:用Qwen3-4B模型自动生成Python代码实战

亲测Open Interpreter&#xff1a;用Qwen3-4B模型自动生成Python代码实战 1. 引言&#xff1a;本地化AI编程的新范式 在当前AI辅助编程快速发展的背景下&#xff0c;开发者对代码生成工具的需求已从“云端智能”逐步转向“本地可控”。Open Interpreter 正是在这一趋势下脱颖…

作者头像 李华
网站建设 2026/4/18 2:30:56

微调后能保持原性能?实测回答质量无下降

微调后能保持原性能&#xff1f;实测回答质量无下降 1. 引言&#xff1a;轻量微调的挑战与目标 在大模型应用落地过程中&#xff0c;指令微调&#xff08;Supervised Fine-Tuning, SFT&#xff09; 是实现角色定制、领域适配的关键步骤。然而&#xff0c;一个长期困扰开发者的…

作者头像 李华
网站建设 2026/4/18 2:26:01

踩过这些坑才明白,YOLOv9镜像这么用才对

踩过这些坑才明白&#xff0c;YOLOv9镜像这么用才对 在深度学习目标检测领域&#xff0c;YOLO系列始终占据着核心地位。随着YOLOv9的发布&#xff0c;其凭借“可编程梯度信息”机制实现了更高效的特征学习能力&#xff0c;成为当前高精度实时检测任务的重要选择。然而&#xf…

作者头像 李华