Python 后端基础(七):Redis 基础和缓存设计,为什么项目离不开 Redis
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 当成唯一数据库,数据丢失风险高。
- 更新数据库后忘记删除缓存,出现旧数据。
- 缓存大对象,导致内存压力过大。
更多推荐
所有评论(0)