Redis 是一款高性能的键值对内存数据库,凭借内存读写、单线程模型、丰富数据结构等特性,被广泛应用于缓存、会话存储、接口限流、消息队列等后端场景。在 FastAPI 项目中集成 Redis,可大幅提升接口响应速度、减轻数据库查询压力,是后端开发的核心必备技能。
本文提供可落地的 FastAPI + Redis 异步集成方案,从环境搭建、配置管理、客户端封装,到接口开发、生命周期管理,全程采用异步编程规范,兼顾代码可维护性与性能,同时补充实操细节和避坑点,带你快速完成集成落地。
一、搭建 Redis 服务(本地 / 远程)
1.1 本地安装(MacOS 推荐)
使用 Homebrew 一键安装,简洁高效,适合开发环境(MacOS 安装 Homebrew):
Bash
# 安装 Redis
brew install redis
1.2 启动 Redis 服务
推荐后台常驻启动(不占用终端,关闭终端仍运行),也可选择前台临时运行(方便查看日志):
Bash
# 方式1:后台常驻启动(开发/生产推荐)
brew services start redis
# 方式2:前台临时运行(仅调试,关闭终端即停止)
redis-server

1.3 基础服务信息
- 默认连接地址:
redis://``localhost:6379 - 默认配置:无密码、使用 0 号数据库
- 验证启动成功:终端输入
redis-cli,进入客户端后输入ping,返回PONG即启动正常
1.4 远程 Redis 服务说明
若使用云服务器 / 远程 Redis,无需本地安装,只需获取以下信息即可:
- 远程 Redis 地址(host)、端口(port)
- 访问密码(password)
- 分配的数据库编号(db)
- 确保服务器开放对应端口,且 Redis 配置允许远程连接(需修改
redis.conf关闭绑定 IP 限制)
二、项目环境与依赖准备
2.1 安装核心依赖
本次集成需安装以下依赖:
Bash
# 核心依赖安装
poetry add fastapi redis pydantic-settings uvicorn
2.2 项目目录结构
目录结构如下(核心文件标注):
Bash
your_project/
├── .env # 环境变量配置(敏感信息,不提交仓库)
├── config.py # Redis 配置类(统一管理连接参数)
├── redis_client.py # Redis 客户端封装(单例+连接池)
├── redis_api.py # Redis 操作接口路由
├── main.py # FastAPI 主程序(生命周期+路由注册)
└── requirements.txt # 项目依赖清单
三、配置文件管理
采用 Pydantic Settings + .env 环境文件的方式管理配置,支持开发 / 测试 / 生产多环境切换,配置统一管理且易于修改,同时隔离敏感信息(如密码)。
3.1 核心配置文件(config.py)
自动从 .env 文件加载配置,支持类型校验,默认值兜底,避免配置缺失导致的报错:
python
from pydantic_settings import BaseSettings, SettingsConfigDict
class RedisConfig(BaseSettings):
"""Redis 连接配置类,自动从 .env 加载,支持类型校验"""
redis_host: str = "localhost" # Redis 地址
redis_port: int = 6379 # Redis 端口
redis_password: str = "" # Redis 密码(无则空)
redis_db: int = 0 # 使用的数据库编号
redis_decode_responses: bool = True # 自动解码响应为字符串(无需手动转码)
redis_max_connections: int = 50 # 连接池最大连接数(避免连接溢出)# 配置 .env 文件加载规则
model_config = SettingsConfigDict(
env_file=".env", # 指定环境文件路径
env_file_encoding="utf-8", # 文件编码
case_sensitive=False # 忽略环境变量大小写)# 创建全局配置实例,项目中统一引用
redis_config = RedisConfig()
3.2 环境变量文件(.env)
存储具体配置值,该文件需添加到 .gitignore 中,禁止提交到代码仓库,避免敏感信息泄露:
Plain
# Redis 基础连接配置(与 RedisConfig 字段对应)
REDIS_HOST=localhost
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DB=0
# 自动解码响应为字符串,建议开启
REDIS_DECODE_RESPONSES=True
# 连接池最大连接数,根据项目并发量调整
REDIS_MAX_CONNECTIONS=50
3.3 多环境配置扩展(可选)
若需要区分开发 / 测试 / 生产环境,可创建多个环境文件(.env.dev、.env.test、.env.prod),并在启动服务时指定:
Plain
# 启动时指定环境文件(开发环境)ENV_FILE=.env.dev uvicorn main:app --reload
同时修改 config.py 中 env_file 为动态读取:
python
import os
model_config = SettingsConfigDict(
env_file=os.getenv("ENV_FILE", ".env"), # 优先读取环境变量指定的文件
env_file_encoding="utf-8")
四、Redis 客户端封装
采用连接池 + 单例模式 封装 Redis 客户端,避免重复创建连接导致的资源泄漏,同时统一管理连接,适配 FastAPI 异步特性。核心使用 redis.asyncio 提供的异步 API,所有操作均为协程。
4.1 客户端封装(redis_client.py)
python
from redis.asyncio import Redis, ConnectionPool
from config import redis_config
# 创建 Redis 连接池(核心:复用连接,提升性能)
redis_connection_pool = ConnectionPool(
host=redis_config.redis_host,
port=redis_config.redis_port,
password=redis_config.redis_password,
db=redis_config.redis_db,
decode_responses=redis_config.redis_decode_responses,
max_connections=redis_config.redis_max_connections,
socket_timeout=5, # 补充:socket 超时时间(秒),避免连接阻塞
socket_connect_timeout=3 # 补充:连接超时时间(秒)
)
# 从连接池创建 Redis 客户端实例(单例,项目中统一引用)
redis_client = Redis.from_pool(redis_connection_pool)
# 可选:添加连通性测试函数(用于服务启动时校验 Redis 连接)
async def check_redis_connect() -> bool:
"""校验 Redis 连通性,返回 True 表示连接正常"""
try:
await redis_client.ping()
return True
except Exception as e:
print(f"Redis 连接失败:{str(e)}")
return False
4.2 基础使用
项目中任意异步代码中,直接导入 redis_client 即可使用,所有操作需加 await(异步协程):
python
from redis_client import redis_client
# 1. 设置键值对(永久有效)
await redis_client.set("name", "fastapi-redis")
# 2. 设置带过期时间的键值对(10 秒后过期)
await redis_client.setex("code", 10, "123456")
# 3. 获取值
value = await redis_client.get("name")
# 4. 删除键
await redis_client.delete("code")
# 5. 判断键是否存在
exists = await redis_client.exists("name")
五、开发 Redis 操作接口
创建 api_router.py,直接基于封装的客户端开发 Redis 基础操作接口:
python
from fastapi import APIRouter, HTTPException
from redis_client import redis_client
from typing import Optional
# 创建路由
router = APIRouter(
prefix="/redis",
tags=["Redis 操作接口"]
)
# 1. 设置缓存(支持过期时间)
@router.post("/set")
async def set_redis_cache(key: str, value: str, expire: Optional[int] = None):
"""
设置 Redis 缓存
- key: 缓存键
- value: 缓存值
- expire: 过期时间(秒),可选
"""
try:
if expire:
await redis_client.setex(key, expire, value)
else:
await redis_client.set(key, value)
return {"status": "success", "msg": f"键 {key} 设置成功"}
except Exception as e:
raise HTTPException(status_code=500, detail=f"设置缓存失败:{str(e)}")
# 2. 获取缓存
@router.get("/get")
async def get_redis_cache(key: str):
"""根据 key 获取 Redis 缓存"""
try:
value = await redis_client.get(key)
if not value:
raise HTTPException(status_code=404, detail=f"键 {key} 不存在")
return {"status": "success", "key": key, "value": value}
except Exception as e:
raise HTTPException(status_code=500, detail=f"获取缓存失败:{str(e)}")
六、FastAPI 生命周期管理
使用 FastAPI 内置的 lifespan 上下文管理器,统一管理服务启动前初始化 和关闭后资源释放,确保 Redis 连接池优雅关闭,避免进程退出时的资源泄漏。
6.1 主程序开发(main.py)
python
from contextlib import asynccontextmanager
from fastapi import FastAPI
import uvicorn
from api_router import router
from redis_client import redis_client, check_redis_connect
# 定义服务生命周期
@asynccontextmanager
async def lifespan(app: FastAPI):
# 服务启动前:执行初始化操作
print("FastAPI 服务启动中,开始校验 Redis 连接...")
redis_connect_status = await check_redis_connect()
if not redis_connect_status:
print("Redis 连接失败,服务启动异常!")
else:
print("Redis 连接成功,服务启动完成!")
yield # 服务运行中
# 服务关闭后:释放资源(优雅关闭 Redis 客户端和连接池)
await redis_client.close()
print("FastAPI 服务已关闭,Redis 客户端及连接池已释放!")
# 创建 FastAPI 实例
app = FastAPI(
title="FastAPI 集成 Redis 项目",
lifespan=lifespan # 绑定生命周期
)
# 注册全局总路由
app.include_router(router)
# 主函数运行服务
if __name__ == "__main__":
uvicorn.run(
"main:app",
host="0.0.0.0", # 允许外部访问
port=8000, # 服务端口
reload=True # 开发环境自动重载(生产环境关闭)
)
6.2 启动并测试服务
终端运行主程序,启动 FastAPI 服务:
Bash
python main.py
服务启动后,可通过以下地址访问:
- Swagger 文档(接口测试):http://127.0.0.1:8000/docs
- ReDoc 文档(接口说明):http://127.0.0.1:8000/redoc
在 Swagger 文档中,找到「Redis 操作接口」,即可直接测试 set/get 等接口。
七、Redis 可视化管理工具推荐
命令行操作 Redis 效率较低,推荐以下可视化工具,支持图形化操作、连接管理、数据查看,适配不同使用场景和系统:
| 工具名称 | 授权方式 | 核心优势 |
|---|---|---|
| Redis Insight | 免费官方 | 官方出品、支持集群/哨兵、监控面板、慢查询分析 |
| Another Redis Desktop Manager | 开源免费 | 中文友好、轻量流畅、支持 SSH 隧道 |
| Tiny RDM | 开源免费 | 极简小巧、启动快、无多余功能 |
| Medis | 免费(Mac) | 界面美观、操作顺滑、Mac 原生体验 |