news 2026/5/1 9:22:04

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/5/1 6:06:37

Day 65:【99天精通Python】Python 操作 Docker - 容器化开发第一步

Day 65&#xff1a;【99天精通Python】Python 操作 Docker - 容器化开发第一步 前言 欢迎来到第65天&#xff01; 在现代软件开发中&#xff0c;Docker 已经成为了标准配置。 环境一致性&#xff1a;不再有 “我本地跑得好好的&#xff0c;怎么服务器上就报错&#xff1f;” 的…

作者头像 李华
网站建设 2026/5/1 6:08:51

万能分类器避坑指南:云端GPU免踩环境配置的坑

万能分类器避坑指南&#xff1a;云端GPU免踩环境配置的坑 你是不是也经历过这样的场景&#xff1f;兴冲冲地想在本地部署一个图像分类模型&#xff0c;结果刚跑 pip install 就开始报错&#xff1a;CUDA 版本不匹配、PyTorch 和 torchvision 对不上、cudatoolkit 找不到合适的…

作者头像 李华
网站建设 2026/5/1 6:02:11

如何高效采集抖音直播数据?douyin-live-go专业解决方案

如何高效采集抖音直播数据&#xff1f;douyin-live-go专业解决方案 【免费下载链接】douyin-live-go 抖音(web) 弹幕爬虫 golang 实现 项目地址: https://gitcode.com/gh_mirrors/do/douyin-live-go 在直播电商蓬勃发展的今天&#xff0c;抖音直播数据已成为企业决策的重…

作者头像 李华
网站建设 2026/4/18 20:25:09

Cursor Free VIP破解神器:一键解锁AI编程助手Pro级权限

Cursor Free VIP破解神器&#xff1a;一键解锁AI编程助手Pro级权限 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tr…

作者头像 李华
网站建设 2026/5/1 7:22:55

3步搞定IP定位:从业务痛点到技术突破的实战指南

3步搞定IP定位&#xff1a;从业务痛点到技术突破的实战指南 【免费下载链接】ip2region Ip2region (2.0 - xdb) 是一个离线IP地址管理与定位框架&#xff0c;能够支持数十亿级别的数据段&#xff0c;并实现十微秒级的搜索性能。它为多种编程语言提供了xdb引擎实现。 项目地址…

作者头像 李华
网站建设 2026/5/1 7:23:32

胡桃工具箱完整指南:简单免费的原神智能管家终极方案

胡桃工具箱完整指南&#xff1a;简单免费的原神智能管家终极方案 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 &#x1f9f0; / Multifunctional Open-Source Genshin Impact Toolkit &#x1f9f0; 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.Huta…

作者头像 李华