code-abyss 1.5.1
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 +21 -0
- package/README.md +197 -0
- package/bin/install.js +193 -0
- package/bin/uninstall.js +42 -0
- package/config/AGENTS.md +247 -0
- package/config/CLAUDE.md +207 -0
- package/config/settings.example.json +27 -0
- package/output-styles/abyss-cultivator.md +399 -0
- package/package.json +41 -0
- package/skills/SKILL.md +115 -0
- package/skills/ai/SKILL.md +29 -0
- package/skills/ai/agent-dev.md +242 -0
- package/skills/ai/llm-security.md +288 -0
- package/skills/architecture/SKILL.md +41 -0
- package/skills/architecture/api-design.md +225 -0
- package/skills/architecture/caching.md +299 -0
- package/skills/architecture/cloud-native.md +285 -0
- package/skills/architecture/compliance.md +299 -0
- package/skills/architecture/data-security.md +184 -0
- package/skills/architecture/message-queue.md +329 -0
- package/skills/architecture/security-arch.md +210 -0
- package/skills/development/SKILL.md +43 -0
- package/skills/development/cpp.md +246 -0
- package/skills/development/go.md +323 -0
- package/skills/development/java.md +277 -0
- package/skills/development/python.md +288 -0
- package/skills/development/rust.md +313 -0
- package/skills/development/shell.md +313 -0
- package/skills/development/typescript.md +277 -0
- package/skills/devops/SKILL.md +36 -0
- package/skills/devops/cost-optimization.md +272 -0
- package/skills/devops/database.md +217 -0
- package/skills/devops/devsecops.md +198 -0
- package/skills/devops/git-workflow.md +181 -0
- package/skills/devops/observability.md +280 -0
- package/skills/devops/performance.md +273 -0
- package/skills/devops/testing.md +186 -0
- package/skills/gen-docs/SKILL.md +114 -0
- package/skills/gen-docs/scripts/doc_generator.py +491 -0
- package/skills/multi-agent/SKILL.md +268 -0
- package/skills/run_skill.py +88 -0
- package/skills/security/SKILL.md +51 -0
- package/skills/security/blue-team.md +379 -0
- package/skills/security/code-audit.md +265 -0
- package/skills/security/pentest.md +226 -0
- package/skills/security/red-team.md +321 -0
- package/skills/security/threat-intel.md +322 -0
- package/skills/security/vuln-research.md +369 -0
- package/skills/tests/README.md +225 -0
- package/skills/tests/SUMMARY.md +362 -0
- package/skills/tests/__init__.py +3 -0
- package/skills/tests/test_change_analyzer.py +558 -0
- package/skills/tests/test_doc_generator.py +538 -0
- package/skills/tests/test_module_scanner.py +376 -0
- package/skills/tests/test_quality_checker.py +516 -0
- package/skills/tests/test_security_scanner.py +426 -0
- package/skills/verify-change/SKILL.md +138 -0
- package/skills/verify-change/scripts/change_analyzer.py +529 -0
- package/skills/verify-module/SKILL.md +125 -0
- package/skills/verify-module/scripts/module_scanner.py +321 -0
- package/skills/verify-quality/SKILL.md +158 -0
- package/skills/verify-quality/scripts/quality_checker.py +481 -0
- package/skills/verify-security/SKILL.md +141 -0
- package/skills/verify-security/scripts/security_scanner.py +368 -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
|
+
|