推荐答案
在 FastAPI 中使用缓存可以通过多种方式实现,常见的方式包括使用内存缓存(如 lru_cache)、外部缓存系统(如 Redis)或 FastAPI 的依赖注入系统。以下是使用 lru_cache 和 Redis 的示例:
使用 lru_cache 进行内存缓存
// www.javascriptcn.com code example
from fastapi import FastAPI
from functools import lru_cache
app = FastAPI()
@lru_cache(maxsize=100)
def expensive_computation(x: int):
# 模拟一个耗时的计算
return x * x
@app.get("/compute/{x}")
async def compute(x: int):
result = expensive_computation(x)
return {"result": result}使用 Redis 进行外部缓存
// www.javascriptcn.com code example
from fastapi import FastAPI
from redis import Redis
app = FastAPI()
redis = Redis(host="localhost", port=6379, db=0)
@app.get("/compute/{x}")
async def compute(x: int):
cached_result = redis.get(f"compute:{x}")
if cached_result:
return {"result": int(cached_result)}
result = x * x
redis.set(f"compute:{x}", result)
return {"result": result}本题详细解读
1. 内存缓存(lru_cache)
lru_cache 是 Python 标准库中的一个装饰器,用于实现最近最少使用(LRU)缓存策略。它适用于缓存那些计算成本较高且结果不经常变化的函数。maxsize 参数指定了缓存的最大容量,超过这个容量时,最久未使用的缓存项会被移除。
- 优点:简单易用,无需额外依赖。
- 缺点:缓存仅存在于内存中,应用重启后缓存会丢失。
2. 外部缓存(Redis)
Redis 是一个高性能的键值存储系统,常用于缓存、消息队列等场景。通过 Redis,可以将缓存数据存储在外部,从而实现跨应用实例的缓存共享。
- 优点:缓存持久化,支持分布式缓存。
- 缺点:需要额外的 Redis 服务器,增加了系统复杂性。
3. 缓存策略的选择
- 内存缓存:适用于单实例应用或缓存数据量较小的场景。
- 外部缓存:适用于多实例应用或需要持久化缓存的场景。
4. 缓存失效与更新
在实际应用中,缓存失效和更新是一个重要问题。可以通过设置缓存的过期时间(TTL)或在数据更新时主动清除缓存来解决这个问题。
# 设置缓存过期时间
redis.set(f"compute:{x}", result, ex=3600) # 缓存1小时后过期
# 主动清除缓存
redis.delete(f"compute:{x}")通过合理选择缓存策略和缓存失效机制,可以显著提升 FastAPI 应用的性能。