mm_cachebase 1.5.0 → 1.7.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/README.md +79 -20
- package/index.js +991 -1038
- package/package.json +6 -3
- package/simple_test.js +70 -0
- package/test.js +471 -68
- package/test_cache/scope1.cache.json +5 -0
- package/test_cache/scope2.cache.json +5 -0
- package/test_cache/scope3.cache.json +5 -0
- package/test_cache/test_scope.cache.json +5 -0
- package/test_multi_file_persistence.js +160 -0
- package/test_persistence.js +138 -0
package/README.md
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
- **完整的事件系统**:支持前置/后置/错误事件,便于日志记录和访问控制
|
|
10
10
|
- **过期时间管理**:支持设置和查询键的过期时间
|
|
11
11
|
- **丰富的数据类型支持**:支持字符串、哈希表等Redis常见数据类型
|
|
12
|
+
- **多文件持久化**:支持数据持久化到文件,通过scope参数实现多实例数据隔离
|
|
12
13
|
|
|
13
14
|
## 安装
|
|
14
15
|
|
|
@@ -43,11 +44,19 @@ async function example() {
|
|
|
43
44
|
### 构造函数
|
|
44
45
|
|
|
45
46
|
```javascript
|
|
46
|
-
const cache = new CacheBase();
|
|
47
|
+
const cache = new CacheBase(scope, config);
|
|
47
48
|
```
|
|
48
49
|
|
|
49
50
|
创建一个新的缓存实例。缓存实例基于EventEmitter,支持完整的事件系统。
|
|
50
51
|
|
|
52
|
+
- `scope`: 缓存作用域名称(默认'sys'),用于多文件持久化时的数据隔离
|
|
53
|
+
- `config`: 配置选项对象,支持以下属性:
|
|
54
|
+
- `dir`: 缓存文件存储目录(默认'./cache/')
|
|
55
|
+
- `expire`: 默认过期时间(秒)(默认0,表示永不过期)
|
|
56
|
+
- `max`: 最大缓存键数量(默认0,表示无限制)
|
|
57
|
+
- `persist`: 是否启用持久化(默认false)
|
|
58
|
+
- `saveInterval`: 定时保存间隔(毫秒)(默认60000)
|
|
59
|
+
|
|
51
60
|
### 基本操作
|
|
52
61
|
|
|
53
62
|
#### 设置缓存
|
|
@@ -232,6 +241,22 @@ await cache.dispose()
|
|
|
232
241
|
```
|
|
233
242
|
- 清理所有资源,移除所有监听器
|
|
234
243
|
|
|
244
|
+
### 持久化操作
|
|
245
|
+
|
|
246
|
+
#### 连接并启动定时保存
|
|
247
|
+
```javascript
|
|
248
|
+
await cache.connect()
|
|
249
|
+
```
|
|
250
|
+
- 启用持久化时启动定时保存功能
|
|
251
|
+
- 返回: 连接成功返回true,失败返回false
|
|
252
|
+
|
|
253
|
+
#### 手动保存数据
|
|
254
|
+
```javascript
|
|
255
|
+
await cache.save()
|
|
256
|
+
```
|
|
257
|
+
- 手动将缓存数据保存到文件
|
|
258
|
+
- 返回: 保存成功返回true,失败返回false
|
|
259
|
+
|
|
235
260
|
### 兼容方法(保持向后兼容)
|
|
236
261
|
|
|
237
262
|
#### 添加缓存(仅当键不存在时)
|
|
@@ -269,6 +294,8 @@ await cache.clear(pattern)
|
|
|
269
294
|
|
|
270
295
|
CacheBase 提供了完整的事件系统,允许你监听各种缓存操作的前后事件,以便进行日志记录、数据验证或操作取消等功能。
|
|
271
296
|
|
|
297
|
+
> **性能优化说明**:从版本 1.6.0 开始,查询类方法(如 get、hget、mget、exists、ttl 等)不再触发事件,以提高高频查询操作的性能。
|
|
298
|
+
|
|
272
299
|
### 事件监听方法
|
|
273
300
|
|
|
274
301
|
```javascript
|
|
@@ -299,15 +326,12 @@ cache.off('event_name', callback);
|
|
|
299
326
|
|
|
300
327
|
#### 基本操作事件
|
|
301
328
|
- `set_before`, `set_after`, `set_error`
|
|
302
|
-
- `get_before`, `get_after`, `get_error`
|
|
303
329
|
- `del_before`, `del_after`, `del_error`
|
|
304
|
-
- `exists_before`, `exists_after`, `exists_error`
|
|
305
330
|
- `mset_before`, `mset_after`, `mset_error`
|
|
306
|
-
- `mget_before`, `mget_after`, `mget_error`
|
|
307
331
|
|
|
308
332
|
#### 过期时间操作事件
|
|
309
333
|
- `expire_before`, `expire_after`, `expire_error`
|
|
310
|
-
- `
|
|
334
|
+
- `persist_before`, `persist_after`, `persist_error`
|
|
311
335
|
|
|
312
336
|
#### 数值操作事件
|
|
313
337
|
- `incr_before`, `incr_after`, `incr_error`
|
|
@@ -318,17 +342,12 @@ cache.off('event_name', callback);
|
|
|
318
342
|
|
|
319
343
|
#### 字符串操作事件
|
|
320
344
|
- `append_before`, `append_after`, `append_error`
|
|
321
|
-
- `strlen_before`, `strlen_after`, `strlen_error`
|
|
322
345
|
|
|
323
346
|
#### 哈希表操作事件
|
|
324
347
|
- `hset_before`, `hset_after`, `hset_error`
|
|
325
|
-
- `hget_before`, `hget_after`, `hget_error`
|
|
326
|
-
- `hgetall_before`, `hgetall_after`, `hgetall_error`
|
|
327
348
|
- `hdel_before`, `hdel_after`, `hdel_error`
|
|
328
349
|
|
|
329
350
|
#### 键操作事件
|
|
330
|
-
- `keys_before`, `keys_after`, `keys_error`
|
|
331
|
-
- `dbsize_before`, `dbsize_after`, `dbsize_error`
|
|
332
351
|
- `flushdb_before`, `flushdb_after`, `flushdb_error`
|
|
333
352
|
- `dispose_before`, `dispose_after`, `dispose_error`
|
|
334
353
|
|
|
@@ -348,14 +367,9 @@ cache.on('set_before', (data) => {
|
|
|
348
367
|
}
|
|
349
368
|
});
|
|
350
369
|
|
|
351
|
-
// 监听获取操作的后置事件
|
|
352
|
-
cache.on('get_after', (data) => {
|
|
353
|
-
console.log(`获取键 ${data.key} 的结果: ${data.result}`);
|
|
354
|
-
});
|
|
355
|
-
|
|
356
370
|
// 错误事件监听
|
|
357
|
-
cache.on('
|
|
358
|
-
console.error(
|
|
371
|
+
cache.on('mset_error', (data) => {
|
|
372
|
+
console.error(`批量设置出错: ${data.error.message}`);
|
|
359
373
|
});
|
|
360
374
|
```
|
|
361
375
|
|
|
@@ -428,6 +442,49 @@ async function numberExample() {
|
|
|
428
442
|
}
|
|
429
443
|
```
|
|
430
444
|
|
|
445
|
+
### 多文件持久化示例
|
|
446
|
+
```javascript
|
|
447
|
+
const CacheBase = require('mm_cachebase');
|
|
448
|
+
|
|
449
|
+
async function persistenceExample() {
|
|
450
|
+
// 创建启用持久化的缓存实例,指定不同的scope
|
|
451
|
+
const userCache = new CacheBase('users', {
|
|
452
|
+
persist: true,
|
|
453
|
+
saveInterval: 30000, // 30秒保存一次
|
|
454
|
+
dir: './test_cache/' // 自定义缓存目录
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
const productCache = new CacheBase('products', {
|
|
458
|
+
persist: true,
|
|
459
|
+
saveInterval: 30000,
|
|
460
|
+
dir: './test_cache/'
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
// 启动定时保存
|
|
464
|
+
await userCache.connect();
|
|
465
|
+
await productCache.connect();
|
|
466
|
+
|
|
467
|
+
// 向不同scope添加数据
|
|
468
|
+
await userCache.set('user1', { name: '张三', age: 30 }, 3600);
|
|
469
|
+
await productCache.set('product1', { id: 1, name: '商品A', price: 99.99 }, 3600);
|
|
470
|
+
|
|
471
|
+
// 数据会分别保存到 users.cache.json 和 products.cache.json
|
|
472
|
+
console.log('数据已保存,不同scope的数据完全隔离');
|
|
473
|
+
|
|
474
|
+
// 手动保存(可选)
|
|
475
|
+
await userCache.save();
|
|
476
|
+
|
|
477
|
+
// 应用重启后,可通过相同的scope加载对应的数据
|
|
478
|
+
const loadedUserCache = new CacheBase('users', { persist: true, dir: './test_cache/' });
|
|
479
|
+
const loadedUser = await loadedUserCache.get('user1');
|
|
480
|
+
console.log('加载的用户数据:', loadedUser);
|
|
481
|
+
|
|
482
|
+
// 销毁实例时,会自动保存数据
|
|
483
|
+
await userCache.dispose();
|
|
484
|
+
await productCache.dispose();
|
|
485
|
+
}
|
|
486
|
+
```
|
|
487
|
+
|
|
431
488
|
### 批量操作示例
|
|
432
489
|
```javascript
|
|
433
490
|
async function batchExample() {
|
|
@@ -455,9 +512,11 @@ async function batchExample() {
|
|
|
455
512
|
|
|
456
513
|
1. 所有操作方法都是异步的,需要使用async/await或Promise处理
|
|
457
514
|
2. 过期时间单位为秒,-1表示永不过期
|
|
458
|
-
3.
|
|
459
|
-
4.
|
|
460
|
-
5.
|
|
515
|
+
3. 缓存数据默认存储在内存中,重启后数据会丢失
|
|
516
|
+
4. 启用持久化时,数据将保存到`{scope}.cache.json`文件,不同scope的数据存储在不同文件中,实现数据隔离
|
|
517
|
+
5. 缓存目录会在第一次使用时自动创建,无需手动创建
|
|
518
|
+
6. 事件回调函数中的 `cancel` 标志只在前置事件中有效,后置事件中修改不会产生效果
|
|
519
|
+
7. 所有事件参数都遵循统一的格式,包含key、value、result、error和cancel等字段
|
|
461
520
|
|
|
462
521
|
## 许可证
|
|
463
522
|
|