Redis 是 Python 后端项目中最常见的中间件之一,常用于缓存、验证码、登录 token、排行榜、限流和任务队列。本文从 Redis 是什么、数据类型、缓存流程和项目场景讲起。

【一、Redis 是什么】

Redis 是一个高性能的内存数据库。

MySQL 主要负责长期保存数据,Redis 主要负责高速读写。

可以这样理解:

MySQL:正式账本,数据长期保存

Redis:高速缓存,访问快,但通常不作为唯一数据来源

Redis 常见用途:

- 缓存热点数据

- 保存验证码

- 保存登录 token 或 session

- 实现接口限流

- 排行榜

- 分布式锁

- 消息队列或 Celery broker

- 任务状态缓存

【二、为什么需要缓存】

如果每次请求都查 MySQL,数据库压力会很大。

例如商品详情页:

用户请求商品详情

-> 先查 Redis

-> Redis 有数据,直接返回

-> Redis 没有数据,再查 MySQL

-> 查到后写入 Redis

-> 返回给用户

这就是常见的 Cache Aside 模式。

【三、Redis 常见数据类型】

【1. String】

最常用,适合保存简单值。

SET user:1:name tom

GET user:1:name

项目场景:

- 验证码

- token

- 计数器

- JSON 字符串缓存

【2. Hash】

适合保存对象字段。

HSET user:1 username tom age 18

HGET user:1 username

项目场景:

- 用户信息

- 配置信息

- 简单对象缓存

【3. List】

有序列表,适合队列结构。

LPUSH queue task1

RPOP queue

项目场景:

- 简单消息队列

- 操作记录

【4. Set】

无序去重集合。

SADD article:1:likes user1 user2

SISMEMBER article:1:likes user1

项目场景:

- 点赞用户集合

- 标签去重

- 黑名单

【5. Sorted Set】

带分数的有序集合。

ZADD rank 100 user1

ZADD rank 80 user2

ZREVRANGE rank 0 9 WITHSCORES

项目场景:

- 排行榜

- 热度榜

- 分数排名

【四、缓存 key 怎么设计】

Redis key 要有清晰命名规则。

推荐:

user:1

user:1:profile

article:100:view_count

login:token:xxx

captcha:email:a@test.com

不推荐:

u1

data

abc

好的 key 设计能让排查问题更容易,也方便设置过期时间。

【五、过期时间怎么设置】

很多缓存必须设置过期时间。

SET captcha:email:a@test.com 123456 EX 300

表示验证码 5 分钟过期。

常见过期时间:

- 验证码:5 分钟

- 登录 token 黑名单:到 token 过期为止

- 热点数据缓存:几分钟到几小时

- 临时任务状态:几小时或一天

缓存不是越久越好,过期时间要结合业务一致性要求。

【六、Python 操作 Redis 示例】

import redis

import json

r = redis.Redis(host="localhost", port=6379, decode_responses=True)

def get_user_profile(user_id: int):

    cache_key = f"user:{user_id}:profile"

    cached = r.get(cache_key)

    if cached:

        return json.loads(cached)

    # 假设这里从 MySQL 查询

    user = {"id": user_id, "username": "tom"}

    r.set(cache_key, json.dumps(user), ex=600)

    return user

核心逻辑:先查缓存,没命中再查数据库,查完写回缓存。

【七、Redis 和 MySQL 数据一致性】

缓存最麻烦的不是读,而是更新。

常见策略:

更新 MySQL

-> 删除 Redis 缓存

-> 下次查询时重新加载

很多项目会选择“更新数据库后删除缓存”,而不是直接更新缓存。因为直接更新缓存容易出现复杂并发问题。

【八、常见坑】

- 缓存不设置过期时间,导致脏数据长期存在。

- key 命名混乱,排查困难。

- 把 Redis 当成唯一数据库,数据丢失风险高。

- 更新数据库后忘记删除缓存,出现旧数据。

- 缓存大对象,导致内存压力过大。

更多推荐