chanjs 2.7.7 → 2.7.10
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/README.md +261 -363
- package/config/index.js +4 -2
- package/core/App.js +35 -0
- package/core/Container.js +56 -29
- package/core/Database.js +58 -8
- package/core/EventBus.js +88 -0
- package/core/Lang.js +56 -0
- package/core/Repository.js +34 -2
- package/core/Task.js +87 -0
- package/core/errors.js +0 -5
- package/doc/00-README.md +208 -0
- package/doc/01-/346/240/270/345/277/203/347/261/273Controller-Service-Repository.md +432 -0
- package/doc/02-/345/223/215/345/272/224/344/270/216/351/224/231/350/257/257.md +255 -0
- package/doc/03-/345/256/211/345/205/250/346/250/241/345/235/227.md +264 -0
- package/doc/04-/345/255/230/345/202/250/344/270/216/347/274/223/345/255/230.md +157 -0
- package/doc/05-/345/267/245/345/205/267/344/270/216/346/240/241/351/252/214.md +309 -0
- package/doc/06-/345/272/224/347/224/250/347/224/237/345/221/275/345/221/250/346/234/237.md +207 -0
- package/doc/07-/344/272/213/344/273/266/347/263/273/347/273/237EventBus.md +324 -0
- package/doc/08-/345/256/232/346/227/266/344/273/273/345/212/241Task.md +262 -0
- package/doc/09-/345/233/275/351/231/205/345/214/226Lang.md +220 -0
- package/index.js +31 -2
- package/middleware/log.js +48 -31
- package/middleware/waf.js +4 -8
- package/package.json +21 -3
- package/response/code.js +0 -12
- package/response/response.js +8 -2
- package/security/keywords.js +2 -3
- package/utils/logger.js +60 -91
- package/utils/signal.js +21 -2
- package/USAGE.md +0 -533
- package/doc/Cache.md +0 -333
- package/doc/Common.md +0 -638
- package/doc/Controller.md +0 -223
- package/doc/Help.md +0 -390
- package/doc/QuickStart.md +0 -116
- package/doc/Repository.md +0 -560
- package/doc/Service.md +0 -240
- package/publish.bat +0 -4
- package/todo.md +0 -1
package/doc/Cache.md
DELETED
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
# Cache 缓存工具
|
|
2
|
-
|
|
3
|
-
## 概述
|
|
4
|
-
|
|
5
|
-
`Cache` 是基于单 Map 实现的 LRU + 惰性 TTL 过期清理缓存类,对齐 Redis incr 行为,专用于限流场景的内存存储。
|
|
6
|
-
|
|
7
|
-
## 特性
|
|
8
|
-
|
|
9
|
-
- **LRU 淘汰**:访问刷新 LRU 顺序,容量超限时自动淘汰最久未使用的条目
|
|
10
|
-
- **惰性 TTL**:自增不续期,批量惰性清理过期条目
|
|
11
|
-
- **容量淘汰**:达到最大容量时自动 LRU 淘汰
|
|
12
|
-
- **高性能**:10w 容量,定时批量清理避免阻塞事件循环
|
|
13
|
-
|
|
14
|
-
## 引入方式
|
|
15
|
-
|
|
16
|
-
```javascript
|
|
17
|
-
import { cache } from 'chanjs';
|
|
18
|
-
|
|
19
|
-
// 或创建自定义实例
|
|
20
|
-
import Cache from 'chanjs/storage/cache.js';
|
|
21
|
-
const customCache = new Cache({ maxSize: 50000, defaultTTL: 60000 });
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## 构造函数
|
|
25
|
-
|
|
26
|
-
```javascript
|
|
27
|
-
new Cache(opts = {})
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
**参数**
|
|
31
|
-
|
|
32
|
-
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
33
|
-
|------|------|------|--------|------|
|
|
34
|
-
| opts.maxSize | number | 否 | 100000 | 缓存最大条目数 |
|
|
35
|
-
| opts.defaultTTL | number | 否 | 300000 (5分钟) | 默认过期时间(毫秒) |
|
|
36
|
-
|
|
37
|
-
## 核心方法
|
|
38
|
-
|
|
39
|
-
### 1. set - 写入缓存
|
|
40
|
-
|
|
41
|
-
```javascript
|
|
42
|
-
set(key, value, ttl = this.defaultTTL)
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
**参数**
|
|
46
|
-
|
|
47
|
-
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
48
|
-
|------|------|------|--------|------|
|
|
49
|
-
| key | string | 是 | - | 缓存键 |
|
|
50
|
-
| value | any | 是 | - | 缓存值 |
|
|
51
|
-
| ttl | number | 否 | defaultTTL | 过期时间(毫秒),<=0 视为永久存储 |
|
|
52
|
-
|
|
53
|
-
**示例**
|
|
54
|
-
|
|
55
|
-
```javascript
|
|
56
|
-
import { cache } from 'chanjs';
|
|
57
|
-
|
|
58
|
-
// 设置 60 秒过期的缓存
|
|
59
|
-
cache.set('user:1001', { name: '张三' }, 60000);
|
|
60
|
-
|
|
61
|
-
// 永久存储(ttl <= 0)
|
|
62
|
-
cache.set('config:app', { version: '1.0' }, 0);
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 2. get - 读取缓存
|
|
66
|
-
|
|
67
|
-
```javascript
|
|
68
|
-
get(key)
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**参数**
|
|
72
|
-
|
|
73
|
-
| 参数 | 类型 | 必填 | 说明 |
|
|
74
|
-
|------|------|------|------|
|
|
75
|
-
| key | string | 是 | 缓存键 |
|
|
76
|
-
|
|
77
|
-
**返回值**
|
|
78
|
-
|
|
79
|
-
- 缓存值:存在且未过期
|
|
80
|
-
- `null`:不存在或已过期
|
|
81
|
-
|
|
82
|
-
**示例**
|
|
83
|
-
|
|
84
|
-
```javascript
|
|
85
|
-
const user = cache.get('user:1001');
|
|
86
|
-
if (user) {
|
|
87
|
-
console.log('用户信息:', user);
|
|
88
|
-
} else {
|
|
89
|
-
console.log('缓存不存在或已过期');
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### 3. has - 检查存在
|
|
94
|
-
|
|
95
|
-
```javascript
|
|
96
|
-
has(key)
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
**参数**
|
|
100
|
-
|
|
101
|
-
| 参数 | 类型 | 必填 | 说明 |
|
|
102
|
-
|------|------|------|------|
|
|
103
|
-
| key | string | 是 | 缓存键 |
|
|
104
|
-
|
|
105
|
-
**返回值**
|
|
106
|
-
|
|
107
|
-
- `true`:存在且未过期
|
|
108
|
-
- `false`:不存在或已过期
|
|
109
|
-
|
|
110
|
-
**示例**
|
|
111
|
-
|
|
112
|
-
```javascript
|
|
113
|
-
if (cache.has('user:1001')) {
|
|
114
|
-
console.log('缓存存在');
|
|
115
|
-
}
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### 4. del - 删除缓存
|
|
119
|
-
|
|
120
|
-
```javascript
|
|
121
|
-
del(key)
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
**示例**
|
|
125
|
-
|
|
126
|
-
```javascript
|
|
127
|
-
cache.del('user:1001');
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### 5. clear - 清空所有
|
|
131
|
-
|
|
132
|
-
```javascript
|
|
133
|
-
clear()
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
**示例**
|
|
137
|
-
|
|
138
|
-
```javascript
|
|
139
|
-
cache.clear();
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### 6. size - 获取数量
|
|
143
|
-
|
|
144
|
-
```javascript
|
|
145
|
-
size()
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
**返回值**
|
|
149
|
-
|
|
150
|
-
缓存条目总数(近似值,包含未惰性清理的过期项)
|
|
151
|
-
|
|
152
|
-
**示例**
|
|
153
|
-
|
|
154
|
-
```javascript
|
|
155
|
-
const count = cache.size();
|
|
156
|
-
console.log(`缓存条目数:${count}`);
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### 7. incr - 自增(限流专用)
|
|
160
|
-
|
|
161
|
-
```javascript
|
|
162
|
-
incr(key, ttlMs = 60000)
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
**参数**
|
|
166
|
-
|
|
167
|
-
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|
|
168
|
-
|------|------|------|--------|------|
|
|
169
|
-
| key | string | 是 | - | 缓存键 |
|
|
170
|
-
| ttlMs | number | 否 | 60000 | 新建 key 的过期时间(毫秒),存量不续期 |
|
|
171
|
-
|
|
172
|
-
**返回值**
|
|
173
|
-
|
|
174
|
-
自增后的值(number)
|
|
175
|
-
|
|
176
|
-
**特性**
|
|
177
|
-
|
|
178
|
-
- 新建 key 使用指定 TTL
|
|
179
|
-
- 存量 key 不续期 TTL
|
|
180
|
-
- 支持容量超限自动 LRU 淘汰
|
|
181
|
-
|
|
182
|
-
**示例**
|
|
183
|
-
|
|
184
|
-
```javascript
|
|
185
|
-
// 限流场景:60 秒内最多 100 次请求
|
|
186
|
-
const count = cache.incr('rate:192.168.1.1', 60000);
|
|
187
|
-
if (count > 100) {
|
|
188
|
-
console.log('请求过于频繁');
|
|
189
|
-
} else {
|
|
190
|
-
console.log(`当前第 ${count} 次请求`);
|
|
191
|
-
}
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### 8. incrAndExpire - 自增并设置过期时间
|
|
195
|
-
|
|
196
|
-
```javascript
|
|
197
|
-
incrAndExpire(key, ttlMs)
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
**参数**
|
|
201
|
-
|
|
202
|
-
| 参数 | 类型 | 必填 | 说明 |
|
|
203
|
-
|------|------|------|------|
|
|
204
|
-
| key | string | 是 | 缓存键 |
|
|
205
|
-
| ttlMs | number | 是 | 新建 key 的过期时间(毫秒) |
|
|
206
|
-
|
|
207
|
-
**返回值**
|
|
208
|
-
|
|
209
|
-
自增后的值(number)
|
|
210
|
-
|
|
211
|
-
**示例**
|
|
212
|
-
|
|
213
|
-
```javascript
|
|
214
|
-
const count = cache.incrAndExpire('limit:api:1001', 30000);
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
### 9. expire - 刷新过期时间
|
|
218
|
-
|
|
219
|
-
```javascript
|
|
220
|
-
expire(key, ttlMs)
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
**参数**
|
|
224
|
-
|
|
225
|
-
| 参数 | 类型 | 必填 | 说明 |
|
|
226
|
-
|------|------|------|------|
|
|
227
|
-
| key | string | 是 | 缓存键 |
|
|
228
|
-
| ttlMs | number | 是 | 新的过期时间(毫秒) |
|
|
229
|
-
|
|
230
|
-
**返回值**
|
|
231
|
-
|
|
232
|
-
- `true`:刷新成功
|
|
233
|
-
- `false`:key 不存在或已过期
|
|
234
|
-
|
|
235
|
-
**示例**
|
|
236
|
-
|
|
237
|
-
```javascript
|
|
238
|
-
// 续期 30 秒
|
|
239
|
-
cache.expire('session:1001', 30000);
|
|
240
|
-
```
|
|
241
|
-
|
|
242
|
-
## 内部机制
|
|
243
|
-
|
|
244
|
-
### LRU 淘汰
|
|
245
|
-
|
|
246
|
-
- 使用 Map 的插入顺序特性
|
|
247
|
-
- 访问时删除再插入,刷新到最新位置
|
|
248
|
-
- 容量超限时淘汰最久未使用的条目
|
|
249
|
-
|
|
250
|
-
### 惰性清理
|
|
251
|
-
|
|
252
|
-
- 每 10 秒触发一次批量清理
|
|
253
|
-
- 单次最多清理 1000 条,避免阻塞事件循环
|
|
254
|
-
- 读取时检查过期状态,过期则删除
|
|
255
|
-
|
|
256
|
-
### 容量配置
|
|
257
|
-
|
|
258
|
-
- 默认最大容量:100,000 条
|
|
259
|
-
- 达到容量上限时自动 LRU 淘汰
|
|
260
|
-
- 可通过构造函数自定义
|
|
261
|
-
|
|
262
|
-
## 使用场景
|
|
263
|
-
|
|
264
|
-
### 1. 接口限流
|
|
265
|
-
|
|
266
|
-
```javascript
|
|
267
|
-
import { cache } from 'chanjs';
|
|
268
|
-
|
|
269
|
-
function rateLimitMiddleware(req, res, next) {
|
|
270
|
-
const ip = req.ip;
|
|
271
|
-
const key = `rate:${ip}`;
|
|
272
|
-
const count = cache.incr(key, 60000); // 60 秒窗口
|
|
273
|
-
|
|
274
|
-
if (count > 100) {
|
|
275
|
-
return res.status(429).json({
|
|
276
|
-
success: false,
|
|
277
|
-
code: 1009,
|
|
278
|
-
msg: '请求过于频繁'
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
next();
|
|
283
|
-
}
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
### 2. 会话缓存
|
|
287
|
-
|
|
288
|
-
```javascript
|
|
289
|
-
// 存储用户会话
|
|
290
|
-
cache.set(`session:${userId}`, {
|
|
291
|
-
userId,
|
|
292
|
-
loginTime: Date.now(),
|
|
293
|
-
role: 'admin'
|
|
294
|
-
}, 3600000); // 1 小时
|
|
295
|
-
|
|
296
|
-
// 读取会话
|
|
297
|
-
const session = cache.get(`session:${userId}`);
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
### 3. 数据缓存
|
|
301
|
-
|
|
302
|
-
```javascript
|
|
303
|
-
// 缓存数据库查询结果
|
|
304
|
-
async function getUserWithCache(userId) {
|
|
305
|
-
const key = `user:${userId}`;
|
|
306
|
-
let user = cache.get(key);
|
|
307
|
-
|
|
308
|
-
if (!user) {
|
|
309
|
-
user = await db('users').where({ id: userId }).first();
|
|
310
|
-
if (user) {
|
|
311
|
-
cache.set(key, user, 300000); // 缓存 5 分钟
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
return user;
|
|
316
|
-
}
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
## 注意事项
|
|
320
|
-
|
|
321
|
-
1. **内存占用**:缓存存储在内存中,应用重启后数据丢失
|
|
322
|
-
2. **容量限制**:默认 10w 条目,超限自动 LRU 淘汰
|
|
323
|
-
3. **过期精度**:惰性清理,过期时间可能有几秒误差
|
|
324
|
-
4. **并发安全**:单线程环境,无需考虑并发问题
|
|
325
|
-
5. **适用场景**:限流计数、临时缓存、会话存储等短 TTL 数据
|
|
326
|
-
6. **不适用**:持久化存储、跨进程共享、大数据量存储
|
|
327
|
-
|
|
328
|
-
## 与 Store 的关系
|
|
329
|
-
|
|
330
|
-
- `Cache` 是底层内存缓存实现
|
|
331
|
-
- `Store` 是统一存储适配层,封装了 `Cache` 和 Redis
|
|
332
|
-
- 业务层推荐使用 `Store`,自动切换内存/Redis
|
|
333
|
-
- 仅在使用纯内存场景时直接使用 `Cache`
|