ccgx-workflow 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +469 -0
- package/README.zh-CN.md +466 -0
- package/bin/ccg.mjs +2 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.mjs +173 -0
- package/dist/index.d.mts +1774 -0
- package/dist/index.d.ts +1774 -0
- package/dist/index.mjs +2029 -0
- package/dist/shared/ccgx-workflow.WgUzkiC3.mjs +5248 -0
- package/package.json +129 -0
- package/templates/commands/agents/assumptions-analyzer.md +129 -0
- package/templates/commands/agents/code-fixer.md +292 -0
- package/templates/commands/agents/codebase-mapper.md +152 -0
- package/templates/commands/agents/debug-session-manager.md +247 -0
- package/templates/commands/agents/debugger.md +111 -0
- package/templates/commands/agents/eval-auditor.md +171 -0
- package/templates/commands/agents/framework-selector.md +152 -0
- package/templates/commands/agents/get-current-datetime.md +29 -0
- package/templates/commands/agents/init-architect.md +114 -0
- package/templates/commands/agents/integration-checker.md +163 -0
- package/templates/commands/agents/interface-auditor.md +170 -0
- package/templates/commands/agents/nyquist-auditor.md +131 -0
- package/templates/commands/agents/pattern-mapper.md +111 -0
- package/templates/commands/agents/phase-runner.md +321 -0
- package/templates/commands/agents/plan-checker.md +255 -0
- package/templates/commands/agents/planner.md +320 -0
- package/templates/commands/agents/team-architect.md +186 -0
- package/templates/commands/agents/team-qa.md +121 -0
- package/templates/commands/agents/team-reviewer.md +157 -0
- package/templates/commands/agents/ui-ux-designer.md +573 -0
- package/templates/commands/agents/verifier.md +274 -0
- package/templates/commands/analyze.md +210 -0
- package/templates/commands/autonomous.md +792 -0
- package/templates/commands/cancel.md +132 -0
- package/templates/commands/clean-branches.md +117 -0
- package/templates/commands/codex-exec.md +404 -0
- package/templates/commands/commit.md +151 -0
- package/templates/commands/context.md +332 -0
- package/templates/commands/debate.md +165 -0
- package/templates/commands/debug.md +226 -0
- package/templates/commands/enhance.md +64 -0
- package/templates/commands/execute.md +380 -0
- package/templates/commands/init.md +123 -0
- package/templates/commands/optimize.md +217 -0
- package/templates/commands/plan.md +373 -0
- package/templates/commands/result.md +106 -0
- package/templates/commands/review.md +338 -0
- package/templates/commands/rollback.md +116 -0
- package/templates/commands/spec-impl.md +139 -0
- package/templates/commands/spec-init.md +101 -0
- package/templates/commands/spec-plan.md +210 -0
- package/templates/commands/spec-research.md +152 -0
- package/templates/commands/spec-review.md +120 -0
- package/templates/commands/status.md +206 -0
- package/templates/commands/team-exec.md +265 -0
- package/templates/commands/test.md +236 -0
- package/templates/commands/verify-work.md +338 -0
- package/templates/commands/verify.md +66 -0
- package/templates/commands/workflow.md +190 -0
- package/templates/commands/worktree.md +128 -0
- package/templates/hooks/ccg-context-monitor.js +159 -0
- package/templates/hooks/ccg-session-state.cjs +510 -0
- package/templates/hooks/ccg-statusline.js +142 -0
- package/templates/output-styles/abyss-command.md +56 -0
- package/templates/output-styles/abyss-concise.md +89 -0
- package/templates/output-styles/abyss-cultivator.md +302 -0
- package/templates/output-styles/abyss-ritual.md +70 -0
- package/templates/output-styles/engineer-professional.md +89 -0
- package/templates/output-styles/laowang-engineer.md +127 -0
- package/templates/output-styles/nekomata-engineer.md +120 -0
- package/templates/output-styles/ojousama-engineer.md +121 -0
- package/templates/prompts/claude/analyzer.md +59 -0
- package/templates/prompts/claude/architect.md +54 -0
- package/templates/prompts/claude/debugger.md +71 -0
- package/templates/prompts/claude/optimizer.md +73 -0
- package/templates/prompts/claude/reviewer.md +63 -0
- package/templates/prompts/claude/tester.md +69 -0
- package/templates/prompts/codex/analyzer.md +58 -0
- package/templates/prompts/codex/architect.md +54 -0
- package/templates/prompts/codex/debugger.md +74 -0
- package/templates/prompts/codex/optimizer.md +81 -0
- package/templates/prompts/codex/reviewer.md +73 -0
- package/templates/prompts/codex/tester.md +62 -0
- package/templates/prompts/gemini/analyzer.md +61 -0
- package/templates/prompts/gemini/architect.md +55 -0
- package/templates/prompts/gemini/debugger.md +78 -0
- package/templates/prompts/gemini/frontend.md +64 -0
- package/templates/prompts/gemini/optimizer.md +84 -0
- package/templates/prompts/gemini/reviewer.md +80 -0
- package/templates/prompts/gemini/tester.md +68 -0
- package/templates/rules/ccg-skill-routing.md +83 -0
- package/templates/rules/ccg-skills.md +71 -0
- package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -0
- package/templates/scripts/invoke-model.mjs +949 -0
- package/templates/scripts/repatch-gemini-plugin.mjs +194 -0
- package/templates/skills/SKILL.md +92 -0
- package/templates/skills/domains/ai/SKILL.md +35 -0
- package/templates/skills/domains/ai/agent-dev.md +242 -0
- package/templates/skills/domains/ai/llm-security.md +288 -0
- package/templates/skills/domains/ai/prompt-and-eval.md +279 -0
- package/templates/skills/domains/ai/rag-system.md +542 -0
- package/templates/skills/domains/architecture/SKILL.md +43 -0
- package/templates/skills/domains/architecture/api-design.md +225 -0
- package/templates/skills/domains/architecture/caching.md +299 -0
- package/templates/skills/domains/architecture/cloud-native.md +285 -0
- package/templates/skills/domains/architecture/message-queue.md +329 -0
- package/templates/skills/domains/architecture/security-arch.md +297 -0
- package/templates/skills/domains/data-engineering/SKILL.md +208 -0
- package/templates/skills/domains/development/SKILL.md +47 -0
- package/templates/skills/domains/development/cpp.md +246 -0
- package/templates/skills/domains/development/go.md +323 -0
- package/templates/skills/domains/development/java.md +277 -0
- package/templates/skills/domains/development/python.md +288 -0
- package/templates/skills/domains/development/rust.md +313 -0
- package/templates/skills/domains/development/shell.md +313 -0
- package/templates/skills/domains/development/typescript.md +277 -0
- package/templates/skills/domains/devops/SKILL.md +40 -0
- package/templates/skills/domains/devops/cost-optimization.md +272 -0
- package/templates/skills/domains/devops/database.md +217 -0
- package/templates/skills/domains/devops/devsecops.md +198 -0
- package/templates/skills/domains/devops/git-workflow.md +181 -0
- package/templates/skills/domains/devops/observability.md +280 -0
- package/templates/skills/domains/devops/performance.md +336 -0
- package/templates/skills/domains/devops/testing.md +283 -0
- package/templates/skills/domains/frontend-design/SKILL.md +244 -0
- package/templates/skills/domains/frontend-design/agents/openai.yaml +4 -0
- package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -0
- package/templates/skills/domains/frontend-design/claymorphism/references/tokens.css +52 -0
- package/templates/skills/domains/frontend-design/component-patterns.md +202 -0
- package/templates/skills/domains/frontend-design/engineering.md +287 -0
- package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -0
- package/templates/skills/domains/frontend-design/glassmorphism/references/tokens.css +32 -0
- package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -0
- package/templates/skills/domains/frontend-design/liquid-glass/references/tokens.css +81 -0
- package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -0
- package/templates/skills/domains/frontend-design/neubrutalism/references/tokens.css +44 -0
- package/templates/skills/domains/frontend-design/reference/color-and-contrast.md +132 -0
- package/templates/skills/domains/frontend-design/reference/interaction-design.md +195 -0
- package/templates/skills/domains/frontend-design/reference/motion-design.md +99 -0
- package/templates/skills/domains/frontend-design/reference/responsive-design.md +114 -0
- package/templates/skills/domains/frontend-design/reference/spatial-design.md +100 -0
- package/templates/skills/domains/frontend-design/reference/typography.md +133 -0
- package/templates/skills/domains/frontend-design/reference/ux-writing.md +107 -0
- package/templates/skills/domains/frontend-design/state-management.md +680 -0
- package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -0
- package/templates/skills/domains/frontend-design/ux-principles.md +156 -0
- package/templates/skills/domains/infrastructure/SKILL.md +201 -0
- package/templates/skills/domains/mobile/SKILL.md +225 -0
- package/templates/skills/domains/orchestration/SKILL.md +30 -0
- package/templates/skills/domains/orchestration/multi-agent.md +263 -0
- package/templates/skills/domains/security/SKILL.md +73 -0
- package/templates/skills/domains/security/blue-team.md +436 -0
- package/templates/skills/domains/security/code-audit.md +265 -0
- package/templates/skills/domains/security/pentest.md +226 -0
- package/templates/skills/domains/security/red-team.md +374 -0
- package/templates/skills/domains/security/threat-intel.md +372 -0
- package/templates/skills/domains/security/vuln-research.md +369 -0
- package/templates/skills/impeccable/adapt/SKILL.md +201 -0
- package/templates/skills/impeccable/animate/SKILL.md +176 -0
- package/templates/skills/impeccable/arrange/SKILL.md +126 -0
- package/templates/skills/impeccable/audit/SKILL.md +149 -0
- package/templates/skills/impeccable/bolder/SKILL.md +118 -0
- package/templates/skills/impeccable/clarify/SKILL.md +185 -0
- package/templates/skills/impeccable/colorize/SKILL.md +144 -0
- package/templates/skills/impeccable/critique/SKILL.md +203 -0
- package/templates/skills/impeccable/critique/reference/cognitive-load.md +106 -0
- package/templates/skills/impeccable/critique/reference/heuristics-scoring.md +234 -0
- package/templates/skills/impeccable/critique/reference/personas.md +178 -0
- package/templates/skills/impeccable/delight/SKILL.md +305 -0
- package/templates/skills/impeccable/distill/SKILL.md +123 -0
- package/templates/skills/impeccable/extract/SKILL.md +94 -0
- package/templates/skills/impeccable/harden/SKILL.md +357 -0
- package/templates/skills/impeccable/normalize/SKILL.md +72 -0
- package/templates/skills/impeccable/onboard/SKILL.md +248 -0
- package/templates/skills/impeccable/optimize/SKILL.md +268 -0
- package/templates/skills/impeccable/overdrive/SKILL.md +143 -0
- package/templates/skills/impeccable/polish/SKILL.md +205 -0
- package/templates/skills/impeccable/quieter/SKILL.md +104 -0
- package/templates/skills/impeccable/teach-impeccable/SKILL.md +72 -0
- package/templates/skills/impeccable/typeset/SKILL.md +117 -0
- package/templates/skills/orchestration/multi-agent/SKILL.md +533 -0
- package/templates/skills/run_skill.js +129 -0
- package/templates/skills/scrapling/SKILL.md +98 -0
- package/templates/skills/scrapling/references/api-quick-ref.md +127 -0
- package/templates/skills/scrapling/references/cookie-vault.md +56 -0
- package/templates/skills/scrapling/references/maintenance.md +79 -0
- package/templates/skills/scrapling/references/site-patterns.md +86 -0
- package/templates/skills/scrapling/references/troubleshooting.md +95 -0
- package/templates/skills/scrapling/templates/basic_fetch.py +19 -0
- package/templates/skills/scrapling/templates/parse_only.py +15 -0
- package/templates/skills/scrapling/templates/session_login.py +19 -0
- package/templates/skills/scrapling/templates/stealth_cloudflare.py +28 -0
- package/templates/skills/tools/extract-learnings/SKILL.md +77 -0
- package/templates/skills/tools/forensics/SKILL.md +89 -0
- package/templates/skills/tools/gen-docs/SKILL.md +116 -0
- package/templates/skills/tools/gen-docs/scripts/doc_generator.js +435 -0
- package/templates/skills/tools/health/SKILL.md +121 -0
- package/templates/skills/tools/lib/shared.js +98 -0
- package/templates/skills/tools/map-codebase/SKILL.md +118 -0
- package/templates/skills/tools/override-refusal/SKILL.md +53 -0
- package/templates/skills/tools/override-refusal/agents/openai.yaml +4 -0
- package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -0
- package/templates/skills/tools/verify-change/SKILL.md +143 -0
- package/templates/skills/tools/verify-change/scripts/change_analyzer.js +289 -0
- package/templates/skills/tools/verify-module/SKILL.md +130 -0
- package/templates/skills/tools/verify-module/scripts/module_scanner.js +171 -0
- package/templates/skills/tools/verify-quality/SKILL.md +163 -0
- package/templates/skills/tools/verify-quality/scripts/quality_checker.js +337 -0
- package/templates/skills/tools/verify-security/SKILL.md +146 -0
- package/templates/skills/tools/verify-security/scripts/security_scanner.js +283 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-design
|
|
3
|
+
description: API 设计。RESTful、GraphQL、OpenAPI、版本管理。当用户提到 API设计、RESTful、GraphQL、OpenAPI、接口设计时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 🏗 阵法秘典 · API 设计
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## RESTful 设计
|
|
10
|
+
|
|
11
|
+
### 资源命名
|
|
12
|
+
```yaml
|
|
13
|
+
# 使用名词复数
|
|
14
|
+
GET /users # 获取用户列表
|
|
15
|
+
GET /users/{id} # 获取单个用户
|
|
16
|
+
POST /users # 创建用户
|
|
17
|
+
PUT /users/{id} # 更新用户
|
|
18
|
+
PATCH /users/{id} # 部分更新
|
|
19
|
+
DELETE /users/{id} # 删除用户
|
|
20
|
+
|
|
21
|
+
# 嵌套资源
|
|
22
|
+
GET /users/{id}/orders
|
|
23
|
+
POST /users/{id}/orders
|
|
24
|
+
|
|
25
|
+
# 避免
|
|
26
|
+
GET /getUsers # ❌ 动词
|
|
27
|
+
GET /user # ❌ 单数
|
|
28
|
+
POST /createUser # ❌ 动词
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### HTTP 状态码
|
|
32
|
+
```yaml
|
|
33
|
+
2xx 成功:
|
|
34
|
+
200: OK
|
|
35
|
+
201: Created
|
|
36
|
+
204: No Content
|
|
37
|
+
|
|
38
|
+
4xx 客户端错误:
|
|
39
|
+
400: Bad Request
|
|
40
|
+
401: Unauthorized
|
|
41
|
+
403: Forbidden
|
|
42
|
+
404: Not Found
|
|
43
|
+
409: Conflict
|
|
44
|
+
422: Unprocessable Entity
|
|
45
|
+
|
|
46
|
+
5xx 服务端错误:
|
|
47
|
+
500: Internal Server Error
|
|
48
|
+
502: Bad Gateway
|
|
49
|
+
503: Service Unavailable
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 响应格式
|
|
53
|
+
```json
|
|
54
|
+
// 成功响应
|
|
55
|
+
{
|
|
56
|
+
"data": {
|
|
57
|
+
"id": 1,
|
|
58
|
+
"name": "Alice"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// 列表响应
|
|
63
|
+
{
|
|
64
|
+
"data": [...],
|
|
65
|
+
"pagination": {
|
|
66
|
+
"page": 1,
|
|
67
|
+
"per_page": 20,
|
|
68
|
+
"total": 100
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// 错误响应
|
|
73
|
+
{
|
|
74
|
+
"error": {
|
|
75
|
+
"code": "VALIDATION_ERROR",
|
|
76
|
+
"message": "Invalid email format",
|
|
77
|
+
"details": [
|
|
78
|
+
{"field": "email", "message": "Invalid format"}
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## OpenAPI 规范
|
|
85
|
+
|
|
86
|
+
```yaml
|
|
87
|
+
openapi: 3.0.3
|
|
88
|
+
info:
|
|
89
|
+
title: User API
|
|
90
|
+
version: 1.0.0
|
|
91
|
+
|
|
92
|
+
paths:
|
|
93
|
+
/users:
|
|
94
|
+
get:
|
|
95
|
+
summary: List users
|
|
96
|
+
parameters:
|
|
97
|
+
- name: page
|
|
98
|
+
in: query
|
|
99
|
+
schema:
|
|
100
|
+
type: integer
|
|
101
|
+
default: 1
|
|
102
|
+
responses:
|
|
103
|
+
'200':
|
|
104
|
+
description: Success
|
|
105
|
+
content:
|
|
106
|
+
application/json:
|
|
107
|
+
schema:
|
|
108
|
+
type: array
|
|
109
|
+
items:
|
|
110
|
+
$ref: '#/components/schemas/User'
|
|
111
|
+
|
|
112
|
+
post:
|
|
113
|
+
summary: Create user
|
|
114
|
+
requestBody:
|
|
115
|
+
required: true
|
|
116
|
+
content:
|
|
117
|
+
application/json:
|
|
118
|
+
schema:
|
|
119
|
+
$ref: '#/components/schemas/CreateUser'
|
|
120
|
+
responses:
|
|
121
|
+
'201':
|
|
122
|
+
description: Created
|
|
123
|
+
|
|
124
|
+
components:
|
|
125
|
+
schemas:
|
|
126
|
+
User:
|
|
127
|
+
type: object
|
|
128
|
+
properties:
|
|
129
|
+
id:
|
|
130
|
+
type: integer
|
|
131
|
+
name:
|
|
132
|
+
type: string
|
|
133
|
+
email:
|
|
134
|
+
type: string
|
|
135
|
+
format: email
|
|
136
|
+
|
|
137
|
+
CreateUser:
|
|
138
|
+
type: object
|
|
139
|
+
required:
|
|
140
|
+
- name
|
|
141
|
+
- email
|
|
142
|
+
properties:
|
|
143
|
+
name:
|
|
144
|
+
type: string
|
|
145
|
+
email:
|
|
146
|
+
type: string
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## GraphQL
|
|
150
|
+
|
|
151
|
+
```graphql
|
|
152
|
+
# Schema
|
|
153
|
+
type User {
|
|
154
|
+
id: ID!
|
|
155
|
+
name: String!
|
|
156
|
+
email: String!
|
|
157
|
+
posts: [Post!]!
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
type Post {
|
|
161
|
+
id: ID!
|
|
162
|
+
title: String!
|
|
163
|
+
author: User!
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
type Query {
|
|
167
|
+
user(id: ID!): User
|
|
168
|
+
users(limit: Int, offset: Int): [User!]!
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
type Mutation {
|
|
172
|
+
createUser(input: CreateUserInput!): User!
|
|
173
|
+
updateUser(id: ID!, input: UpdateUserInput!): User!
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
input CreateUserInput {
|
|
177
|
+
name: String!
|
|
178
|
+
email: String!
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
# Query
|
|
182
|
+
query GetUser($id: ID!) {
|
|
183
|
+
user(id: $id) {
|
|
184
|
+
name
|
|
185
|
+
email
|
|
186
|
+
posts {
|
|
187
|
+
title
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## 版本管理
|
|
194
|
+
|
|
195
|
+
```yaml
|
|
196
|
+
策略:
|
|
197
|
+
URL路径: /api/v1/users (推荐)
|
|
198
|
+
请求头: Accept: application/vnd.api+json;version=1
|
|
199
|
+
查询参数: /api/users?version=1
|
|
200
|
+
|
|
201
|
+
原则:
|
|
202
|
+
- 向后兼容
|
|
203
|
+
- 废弃通知
|
|
204
|
+
- 迁移指南
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## 安全设计
|
|
208
|
+
|
|
209
|
+
```yaml
|
|
210
|
+
认证:
|
|
211
|
+
- API Key
|
|
212
|
+
- JWT
|
|
213
|
+
- OAuth 2.0
|
|
214
|
+
|
|
215
|
+
授权:
|
|
216
|
+
- RBAC
|
|
217
|
+
- ABAC
|
|
218
|
+
- Scope
|
|
219
|
+
|
|
220
|
+
防护:
|
|
221
|
+
- 速率限制
|
|
222
|
+
- 输入验证
|
|
223
|
+
- HTTPS
|
|
224
|
+
```
|
|
225
|
+
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: caching
|
|
3
|
+
description: 缓存策略秘典。缓存模式、Redis实践、三大问题、CDN、缓存一致性。当用户提到缓存、Redis、CDN、缓存穿透、缓存击穿、缓存雪崩时路由到此。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 🏗 阵法秘典 · 缓存策略
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## 缓存层次
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
客户端缓存 (浏览器/App)
|
|
13
|
+
↓ miss
|
|
14
|
+
CDN 缓存 (边缘节点)
|
|
15
|
+
↓ miss
|
|
16
|
+
网关缓存 (Nginx/API Gateway)
|
|
17
|
+
↓ miss
|
|
18
|
+
应用缓存 (本地内存/进程内)
|
|
19
|
+
↓ miss
|
|
20
|
+
分布式缓存 (Redis/Memcached)
|
|
21
|
+
↓ miss
|
|
22
|
+
数据库
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
| 层级 | 延迟 | 容量 | 一致性 |
|
|
26
|
+
|------|------|------|--------|
|
|
27
|
+
| L1 本地内存 | ~ns | MB级 | 进程内一致 |
|
|
28
|
+
| L2 分布式缓存 | ~ms | GB级 | 最终一致 |
|
|
29
|
+
| L3 CDN | ~10ms | TB级 | TTL控制 |
|
|
30
|
+
| DB | ~10-100ms | PB级 | 强一致 |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 缓存模式
|
|
35
|
+
|
|
36
|
+
### Cache-Aside (旁路缓存)
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
读:
|
|
40
|
+
1. 查缓存 → 命中 → 返回
|
|
41
|
+
2. 未命中 → 查DB → 写入缓存 → 返回
|
|
42
|
+
|
|
43
|
+
写:
|
|
44
|
+
1. 更新DB
|
|
45
|
+
2. 删除缓存 (而非更新)
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
```python
|
|
49
|
+
def get_user(user_id: str) -> dict:
|
|
50
|
+
# 1. 查缓存
|
|
51
|
+
cached = redis.get(f"user:{user_id}")
|
|
52
|
+
if cached:
|
|
53
|
+
return json.loads(cached)
|
|
54
|
+
|
|
55
|
+
# 2. 查DB
|
|
56
|
+
user = db.query("SELECT * FROM users WHERE id = %s", user_id)
|
|
57
|
+
|
|
58
|
+
# 3. 写缓存
|
|
59
|
+
redis.setex(f"user:{user_id}", 3600, json.dumps(user))
|
|
60
|
+
return user
|
|
61
|
+
|
|
62
|
+
def update_user(user_id: str, data: dict):
|
|
63
|
+
db.execute("UPDATE users SET ... WHERE id = %s", user_id)
|
|
64
|
+
redis.delete(f"user:{user_id}") # 删除而非更新
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**适用**:通用场景,应用控制缓存逻辑。
|
|
68
|
+
|
|
69
|
+
### Read-Through (读穿透)
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
读:
|
|
73
|
+
1. 查缓存 → 命中 → 返回
|
|
74
|
+
2. 未命中 → 缓存层自动查DB → 写入缓存 → 返回
|
|
75
|
+
|
|
76
|
+
应用只与缓存交互,不直接访问DB。
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**适用**:缓存中间件支持(如 Hibernate L2 Cache)。
|
|
80
|
+
|
|
81
|
+
### Write-Through (写穿透)
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
写:
|
|
85
|
+
1. 写缓存
|
|
86
|
+
2. 缓存层同步写DB
|
|
87
|
+
3. 两者都成功才返回
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**适用**:强一致性要求,写入不频繁。
|
|
91
|
+
|
|
92
|
+
### Write-Behind (异步写回)
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
写:
|
|
96
|
+
1. 写缓存 → 立即返回
|
|
97
|
+
2. 缓存层异步批量写DB
|
|
98
|
+
|
|
99
|
+
风险: 缓存宕机可能丢数据
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**适用**:写入频繁、可容忍短暂不一致。
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Redis 实践
|
|
107
|
+
|
|
108
|
+
### 数据结构选型
|
|
109
|
+
|
|
110
|
+
| 结构 | 场景 | 示例 |
|
|
111
|
+
|------|------|------|
|
|
112
|
+
| String | 简单KV、计数器 | 用户信息、页面PV |
|
|
113
|
+
| Hash | 对象属性 | 用户Profile各字段 |
|
|
114
|
+
| List | 队列、最新列表 | 消息队列、最新动态 |
|
|
115
|
+
| Set | 去重、交集 | 标签、共同好友 |
|
|
116
|
+
| Sorted Set | 排行榜、延迟队列 | 积分排名、定时任务 |
|
|
117
|
+
| Stream | 消息流 | 事件日志 |
|
|
118
|
+
|
|
119
|
+
### 过期策略
|
|
120
|
+
|
|
121
|
+
```yaml
|
|
122
|
+
策略:
|
|
123
|
+
惰性删除: 访问时检查是否过期
|
|
124
|
+
定期删除: 每秒随机检查一批 key
|
|
125
|
+
内存淘汰: 内存满时触发
|
|
126
|
+
|
|
127
|
+
淘汰策略 (maxmemory-policy):
|
|
128
|
+
volatile-lru: 有过期时间的 key 中 LRU
|
|
129
|
+
allkeys-lru: 所有 key 中 LRU (推荐)
|
|
130
|
+
volatile-ttl: 有过期时间的 key 中 TTL 最小
|
|
131
|
+
noeviction: 不淘汰,写入报错
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### 分布式锁
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
import redis
|
|
138
|
+
import uuid
|
|
139
|
+
|
|
140
|
+
def acquire_lock(conn: redis.Redis, lock_name: str, timeout: int = 10) -> str:
|
|
141
|
+
token = str(uuid.uuid4())
|
|
142
|
+
if conn.set(f"lock:{lock_name}", token, nx=True, ex=timeout):
|
|
143
|
+
return token
|
|
144
|
+
return None
|
|
145
|
+
|
|
146
|
+
def release_lock(conn: redis.Redis, lock_name: str, token: str) -> bool:
|
|
147
|
+
# Lua 脚本保证原子性
|
|
148
|
+
script = """
|
|
149
|
+
if redis.call("get", KEYS[1]) == ARGV[1] then
|
|
150
|
+
return redis.call("del", KEYS[1])
|
|
151
|
+
else
|
|
152
|
+
return 0
|
|
153
|
+
end
|
|
154
|
+
"""
|
|
155
|
+
return conn.eval(script, 1, f"lock:{lock_name}", token)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 三大问题
|
|
161
|
+
|
|
162
|
+
### 缓存穿透 (Cache Penetration)
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
问题: 查询不存在的数据,每次都打到DB
|
|
166
|
+
攻击: 恶意请求大量不存在的ID
|
|
167
|
+
|
|
168
|
+
解决方案:
|
|
169
|
+
1. 布隆过滤器 (Bloom Filter)
|
|
170
|
+
请求 → 布隆过滤器 → 不存在则直接返回
|
|
171
|
+
|
|
172
|
+
2. 缓存空值
|
|
173
|
+
redis.setex(f"user:{user_id}", 300, "NULL") # 短TTL
|
|
174
|
+
|
|
175
|
+
3. 参数校验
|
|
176
|
+
ID格式校验,拦截非法请求
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### 缓存击穿 (Cache Breakdown)
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
问题: 热点key过期瞬间,大量请求打到DB
|
|
183
|
+
|
|
184
|
+
解决方案:
|
|
185
|
+
1. 互斥锁 (Mutex)
|
|
186
|
+
未命中 → 获取锁 → 查DB → 写缓存 → 释放锁
|
|
187
|
+
其他请求等待或返回旧值
|
|
188
|
+
|
|
189
|
+
2. 永不过期 + 异步更新
|
|
190
|
+
逻辑过期: 缓存中存储过期时间,过期后异步刷新
|
|
191
|
+
|
|
192
|
+
3. 热点预加载
|
|
193
|
+
提前刷新即将过期的热点key
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 缓存雪崩 (Cache Avalanche)
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
问题: 大量key同时过期,或缓存服务宕机
|
|
200
|
+
|
|
201
|
+
解决方案:
|
|
202
|
+
1. 过期时间加随机值
|
|
203
|
+
ttl = base_ttl + random(0, 300) # 打散过期时间
|
|
204
|
+
|
|
205
|
+
2. 多级缓存
|
|
206
|
+
L1(本地) + L2(Redis) → Redis挂了还有本地缓存
|
|
207
|
+
|
|
208
|
+
3. 熔断降级
|
|
209
|
+
缓存不可用时,限流 + 降级返回默认值
|
|
210
|
+
|
|
211
|
+
4. Redis 高可用
|
|
212
|
+
Sentinel / Cluster 模式
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## CDN 缓存
|
|
218
|
+
|
|
219
|
+
### 缓存策略
|
|
220
|
+
|
|
221
|
+
```yaml
|
|
222
|
+
静态资源:
|
|
223
|
+
Cache-Control: public, max-age=31536000, immutable
|
|
224
|
+
文件名含 hash: app.a1b2c3.js
|
|
225
|
+
|
|
226
|
+
API 响应:
|
|
227
|
+
Cache-Control: public, max-age=60, s-maxage=300
|
|
228
|
+
Vary: Accept-Encoding, Authorization
|
|
229
|
+
|
|
230
|
+
不缓存:
|
|
231
|
+
Cache-Control: no-store
|
|
232
|
+
Set-Cookie 响应
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 缓存失效
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# 主动失效
|
|
239
|
+
aws cloudfront create-invalidation \
|
|
240
|
+
--distribution-id E1234 \
|
|
241
|
+
--paths "/api/*" "/images/logo.png"
|
|
242
|
+
|
|
243
|
+
# 版本化 URL (推荐)
|
|
244
|
+
/static/app.v2.js → 新版本新URL,无需失效
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## 缓存一致性
|
|
250
|
+
|
|
251
|
+
### 最终一致性方案
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
方案1: 先更新DB,再删缓存 (推荐)
|
|
255
|
+
问题: 删缓存失败 → 数据不一致
|
|
256
|
+
解决: 重试机制 / 消息队列异步删除
|
|
257
|
+
|
|
258
|
+
方案2: 延迟双删
|
|
259
|
+
1. 删缓存
|
|
260
|
+
2. 更新DB
|
|
261
|
+
3. 延迟N秒再删缓存 (覆盖并发读写)
|
|
262
|
+
|
|
263
|
+
方案3: 订阅 Binlog
|
|
264
|
+
DB变更 → Binlog → Canal/Debezium → 删除/更新缓存
|
|
265
|
+
最可靠,但架构复杂
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 一致性级别选择
|
|
269
|
+
|
|
270
|
+
| 级别 | 方案 | 延迟 | 复杂度 |
|
|
271
|
+
|------|------|------|--------|
|
|
272
|
+
| 强一致 | Write-Through | 高 | 中 |
|
|
273
|
+
| 最终一致 | Cache-Aside + 删除 | 低 | 低 |
|
|
274
|
+
| 最终一致(可靠) | Binlog 订阅 | 中 | 高 |
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## 最佳实践
|
|
279
|
+
|
|
280
|
+
```yaml
|
|
281
|
+
设计:
|
|
282
|
+
- 缓存 key 规范: {业务}:{实体}:{ID}
|
|
283
|
+
- 合理 TTL: 热数据短(分钟),冷数据长(小时)
|
|
284
|
+
- 大 value 拆分: 单 value < 10KB
|
|
285
|
+
- 避免 Big Key: 集合类型 < 5000 元素
|
|
286
|
+
|
|
287
|
+
运维:
|
|
288
|
+
- 监控命中率 (目标 > 95%)
|
|
289
|
+
- 监控内存使用和淘汰率
|
|
290
|
+
- 慢查询日志分析
|
|
291
|
+
- 定期清理无用 key
|
|
292
|
+
|
|
293
|
+
安全:
|
|
294
|
+
- 禁止外网直连 Redis
|
|
295
|
+
- 启用 AUTH 认证
|
|
296
|
+
- 禁用危险命令 (KEYS/FLUSHALL)
|
|
297
|
+
- 定期备份 (RDB + AOF)
|
|
298
|
+
```
|
|
299
|
+
|