Skip to content

Commit a57ac31

Browse files
committed
update docs
1 parent 00b795a commit a57ac31

File tree

2 files changed

+83
-4
lines changed

2 files changed

+83
-4
lines changed

docs/.vuepress/sidebar.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,19 @@ export const mySidebar: ThemeSidebarMulti = {
3535
{ text: 'CRUD', link: 'CRUD' },
3636
{ text: '分页', link: 'pagination' },
3737
{ text: '接口响应', link: 'response' },
38-
{ text: '国际化', link: 'i18n' },
3938
{ text: 'JWT', link: 'jwt' },
4039
{ text: 'RBAC', link: 'RBAC' },
4140
{ text: 'CORS', link: 'CORS' },
4241
{ text: '时区', link: 'timezone' },
4342
{ text: '节流', link: 'limit' },
44-
{ text: '切换主键', link: 'pk' },
45-
{ text: '切换数据库', link: 'db' },
4643
{ text: '事务', link: 'transaction' },
47-
{ text: 'OAuth 2.0', link: 'oauth2' },
44+
{ text: '缓存', link: 'cache' },
45+
{ text: '国际化', link: 'i18n' },
4846
{ text: '数据权限', link: 'data-permission' },
4947
{ text: '代码生成', link: 'code-generation' },
48+
{ text: '切换主键', link: 'pk' },
49+
{ text: '切换数据库', link: 'db' },
50+
{ text: 'OAuth 2.0', link: 'oauth2' },
5051
{ text: 'SocketIo', link: 'socketio' },
5152
{ text: 'Celery', link: 'celery' },
5253
{ text: 'APScheduler', link: 'apscheduler' },

docs/backend/reference/cache.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
---
2+
title: 缓存
3+
---
4+
5+
## 编程式缓存
6+
7+
- 完全手动控制缓存的读写、失效、TTL 等
8+
- 适合复杂逻辑、批量操作、自定义序列化、事务等高级场景
9+
- 代码较为显式,易于调试,但重复代码多,容易出错
10+
11+
### 依赖
12+
13+
所有操作都通过 `backend/database/redis.py` 中的全局 Redis 客户端完成:
14+
15+
```python
16+
# 创建 redis 客户端单例
17+
redis_client: RedisCli = RedisCli()
18+
```
19+
20+
## 声明式缓存
21+
22+
- 通过装饰器自动管理缓存生命周期
23+
- 代码极简,关注点分离,适合标准 CRUD
24+
25+
### @cached
26+
27+
自动缓存函数结果
28+
29+
```python
30+
from backend.common.cache.decorator import cached
31+
32+
@cached(name="user:detail", key="user_id")
33+
async def get_user_detail(user_id: int):
34+
user = await User.get_or_none(id=user_id)
35+
return user.dict() if user else None
36+
```
37+
38+
- 第一次调用 → 执行函数 → 缓存结果
39+
- 后续调用 → 直接从缓存(L1 或 Redis)返回
40+
41+
### @cache_invalidate
42+
43+
方法执行后自动失效指定缓存
44+
45+
```python
46+
from backend.common.cache.decorator import cache_invalidate
47+
48+
@cache_invalidate(name="user:detail", key="user_id")
49+
async def update_user(user_id: int, name: str):
50+
await User.filter(id=user_id).update(name=name)
51+
return {"message": "updated"}
52+
```
53+
54+
- 执行更新后 → 自动删除 L1 和 Redis 缓存
55+
- 通过 Pub/Sub 广播 → 通知其他节点清理本地 L1 缓存
56+
57+
## 对比
58+
59+
| 维度 | 编程式缓存 | 声明式缓存(装饰器) |
60+
|-------|---------------------------|--------------------|
61+
| 代码量 | 多(每个地方都要写 get/set/delete) | 极少(一行装饰器即可) |
62+
| 一致性保障 | 需手动保证(容易遗漏失效) | 自动处理 + Pub/Sub 广播 |
63+
| 灵活性 | 最高 | 较高(支持 key_builder) |
64+
| 开发效率 | 较低 ||
65+
| 维护成本 | 高(修改逻辑需改多处) | 低(改装饰器参数即可) |
66+
| 适用场景 | 复杂缓存策略、批量、预热、特殊数据 | 标准 CRUD、列表、详情、热点数据 |
67+
| 调试难度 | 低(逻辑显式) | 中等(需理解装饰器内部流程) |
68+
69+
## 使用策略
70+
71+
大多数项目推荐以下模式:
72+
73+
- **特殊场景** → 使用编程式手动操作
74+
- **读操作**(详情、列表、热点数据) → 使用 `@cached` 声明式缓存
75+
- **删/改操作** → 使用 `@cache_invalidate` 声明式失效
76+
- **开启本地缓存** → L1(内存)缓存将进一步提速,L2(Redis)作为持久层
77+
- **追求开发效率和代码简洁** → 优先使用声明式缓存
78+
- **需要精细控制、复杂逻辑** → 使用编程式缓存

0 commit comments

Comments
 (0)