news 2026/4/3 4:49:09

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/3/22 21:22:56

零基础学AI图像修复:GPEN手把手教学,云端环境打开就用

零基础学AI图像修复&#xff1a;GPEN手把手教学&#xff0c;云端环境打开就用 你是不是也和我一样&#xff0c;退休后想学点新东西&#xff1f;以前搞了一辈子工程设计、机械维修&#xff0c;现在看着年轻人动不动就说“AI”“深度学习”&#xff0c;心里既好奇又有点发怵。尤…

作者头像 李华
网站建设 2026/4/3 2:29:16

Trilium Notes中文版:打造你的专属知识管理解决方案

Trilium Notes中文版&#xff1a;打造你的专属知识管理解决方案 【免费下载链接】trilium-translation Translation for Trilium Notes. Trilium Notes 中文适配, 体验优化 项目地址: https://gitcode.com/gh_mirrors/tr/trilium-translation 还在为寻找一款既强大又好用…

作者头像 李华
网站建设 2026/3/16 9:13:45

NotaGen实战:基于LLM的古典音乐生成模型全解析

NotaGen实战&#xff1a;基于LLM的古典音乐生成模型全解析 1. 引言&#xff1a;AI与古典音乐创作的新范式 在人工智能技术不断渗透各个领域的今天&#xff0c;音乐创作正迎来一场深刻的变革。传统上被视为高度依赖人类情感与艺术直觉的古典音乐领域&#xff0c;也开始被深度学…

作者头像 李华
网站建设 2026/3/12 22:17:08

Whisper Large v3 GPU配置:显存不足解决方案

Whisper Large v3 GPU配置&#xff1a;显存不足解决方案 1. 引言 1.1 项目背景与技术挑战 随着多语言语音识别需求的快速增长&#xff0c;OpenAI推出的Whisper系列模型已成为行业标杆。其中&#xff0c;Whisper Large v3凭借其1.5B参数规模和对99种语言的支持&#xff0c;在…

作者头像 李华
网站建设 2026/3/13 4:02:54

解锁本地观影新体验:BiliLocal智能弹幕播放器完全指南

解锁本地观影新体验&#xff1a;BiliLocal智能弹幕播放器完全指南 【免费下载链接】BiliLocal add danmaku to local videos 项目地址: https://gitcode.com/gh_mirrors/bi/BiliLocal 还在为观看本地视频时缺少互动体验而烦恼吗&#xff1f;BiliLocal弹幕播放器正是您需…

作者头像 李华
网站建设 2026/3/28 12:15:09

亲测PyTorch-2.x-Universal-Dev镜像,AI开发环境一键配置太省心

亲测PyTorch-2.x-Universal-Dev镜像&#xff0c;AI开发环境一键配置太省心 1. 背景与痛点&#xff1a;深度学习环境配置的“地狱模式” 在从事AI研发的过程中&#xff0c;最令人头疼的往往不是模型设计本身&#xff0c;而是开发环境的搭建与依赖管理。尤其是当项目涉及多个开…

作者头像 李华