mm_cachebase 1.4.5 → 1.5.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/index.js CHANGED
@@ -1,537 +1,1217 @@
1
- /**
2
- * @fileOverview 本地缓存类
3
- * @author <a href="http://qww.elins.cn">邱文武</a>
4
- * @version 1.0
5
- */
6
- require('mm_expand');
7
-
8
- /**
9
- * 创建基本缓存CacheBase帮助类函数
10
- */
11
- class CacheBase {
12
- /**
13
- * 构造函数
14
- */
15
- constructor() {
16
- // 缓存的字典
17
- this.dict = {};
18
- // 到期通知函数
19
- this.func;
20
- /*
21
- 格式:
22
- {
23
- {
24
- // ID,为时间戳
25
- id:
26
- // 键名
27
- name:
28
- // 保存值
29
- value: "hello world",
30
- // 最大时效
31
- maxAge: -1,
32
- // 到期时间
33
- expires: ""
34
- }
35
- }
36
- */
37
- }
38
-
39
- get list() {
40
- var list = [];
41
- for (var key in this.dict) {
42
- list.push(this.dict[key]);
43
- }
44
- return list;
45
- }
46
-
47
- set list(lt) {
48
- this.dict = {};
49
- for (var i = 0; i < lt.length; i++) {
50
- var o = lt;
51
- this.dict[o.name] = o;
52
- }
53
- }
1
+ require('mm_logs');
2
+ const EventEmitter = require('events');
3
+
4
+ // 符合Redis API的CacheBase类
5
+ class CacheBase extends EventEmitter {
6
+ constructor() {
7
+ super();
8
+ this.data = {};
9
+ this.dict = this.data; // 为了兼容test.js中的访问
10
+ this.list = []; // 为了兼容test.js,存储所有键
11
+ }
12
+
13
+ // 基本的set方法,包含事件触发
14
+ async set(key, value) {
15
+ return new Promise((resolve) => {
16
+ try {
17
+ // 触发前置事件
18
+ const beforeEventData = {
19
+ key,
20
+ value,
21
+ cancel: false
22
+ };
23
+ this.emit('set_before', beforeEventData);
24
+
25
+ // 如果事件处理器设置了cancel为true,则取消操作
26
+ if (beforeEventData.cancel) {
27
+ resolve(0);
28
+ return;
29
+ }
30
+
31
+ // 执行实际操作
32
+ this.data[key] = { value, expire: 0 };
33
+
34
+ // 如果键不存在于列表中,添加到列表
35
+ if (!this.list.includes(key)) {
36
+ this.list.push(key);
37
+ }
38
+
39
+ // 触发后置事件
40
+ this.emit('set_after', {
41
+ key,
42
+ value,
43
+ result: 'OK'
44
+ });
45
+ resolve('OK');
46
+ } catch (error) {
47
+ // 触发错误事件
48
+ this.emit('set_error', {
49
+ key,
50
+ value,
51
+ error
52
+ });
53
+ $.log.error('[cachebase] set操作失败:', error);
54
+ resolve(null);
55
+ }
56
+ });
57
+ }
58
+
59
+ // 基本的del方法,包含事件触发
60
+ async del(key) {
61
+ return new Promise((resolve) => {
62
+ try {
63
+ // 触发前置事件
64
+ const beforeEventData = {
65
+ key,
66
+ cancel: false
67
+ };
68
+ this.emit('del_before', beforeEventData);
69
+
70
+ // 如果事件处理器设置了cancel为true,则取消操作
71
+ if (beforeEventData.cancel) {
72
+ resolve(0);
73
+ return;
74
+ }
75
+
76
+ // 检查键是否存在
77
+ const exists = key in this.data;
78
+
79
+ // 执行删除操作
80
+ if (exists) {
81
+ delete this.data[key];
82
+ // 从列表中移除
83
+ const index = this.list.indexOf(key);
84
+ if (index > -1) {
85
+ this.list.splice(index, 1);
86
+ }
87
+ }
88
+
89
+ // 触发后置事件
90
+ this.emit('del_after', {
91
+ key,
92
+ result: exists ? 1 : 0
93
+ });
94
+ resolve(exists ? 1 : 0);
95
+ } catch (error) {
96
+ // 触发错误事件
97
+ this.emit('del_error', {
98
+ key,
99
+ error
100
+ });
101
+ $.log.error('[cachebase] del操作失败:', error);
102
+ resolve(0);
103
+ }
104
+ });
105
+ }
106
+
107
+ // 基本的get方法,包含事件触发
108
+ async get(key) {
109
+ return new Promise((resolve) => {
110
+ try {
111
+ // 触发前置事件
112
+ const beforeEventData = {
113
+ key,
114
+ cancel: false
115
+ };
116
+ this.emit('get_before', beforeEventData);
117
+
118
+ // 如果事件处理器设置了cancel为true,则取消操作
119
+ if (beforeEventData.cancel) {
120
+ resolve(null);
121
+ return;
122
+ }
123
+
124
+ // 执行实际操作
125
+ const obj = this.data[key];
126
+ let result = null;
127
+ if (obj) {
128
+ result = obj.value;
129
+ }
130
+
131
+ // 触发后置事件
132
+ this.emit('get_after', {
133
+ key,
134
+ result
135
+ });
136
+ resolve(result);
137
+ } catch (error) {
138
+ // 触发错误事件
139
+ this.emit('get_error', {
140
+ key,
141
+ error
142
+ });
143
+ $.log.error('[cachebase] get操作失败:', error);
144
+ resolve(null);
145
+ }
146
+ });
147
+ }
148
+
149
+ // Redis兼容的getset方法
150
+ async getset(key, value) {
151
+ return new Promise((resolve) => {
152
+ try {
153
+ // 触发前置事件
154
+ const beforeEventData = {
155
+ key,
156
+ value,
157
+ cancel: false
158
+ };
159
+ this.emit('getset_before', beforeEventData);
160
+
161
+ // 如果事件处理器设置了cancel为true,则取消操作
162
+ if (beforeEventData.cancel) {
163
+ resolve(null);
164
+ return;
165
+ }
166
+
167
+ // 获取旧值
168
+ const obj = this.data[key];
169
+ const oldValue = obj ? obj.value : null;
170
+
171
+ // 设置新值
172
+ this.data[key] = { value, expire: 0 };
173
+
174
+ // 如果键不存在于列表中,添加到列表
175
+ if (!this.list.includes(key)) {
176
+ this.list.push(key);
177
+ }
178
+
179
+ // 触发后置事件
180
+ this.emit('getset_after', {
181
+ key,
182
+ value,
183
+ result: oldValue
184
+ });
185
+ resolve(oldValue);
186
+ } catch (error) {
187
+ // 触发错误事件
188
+ this.emit('getset_error', {
189
+ key,
190
+ value,
191
+ error
192
+ });
193
+ $.log.error('[cachebase] getset操作失败:', error);
194
+ resolve(null);
195
+ }
196
+ });
197
+ }
198
+
199
+ // Redis兼容的append方法
200
+ async append(key, value) {
201
+ return new Promise((resolve) => {
202
+ try {
203
+ // 触发前置事件
204
+ const beforeEventData = {
205
+ key,
206
+ value,
207
+ cancel: false
208
+ };
209
+ this.emit('append_before', beforeEventData);
210
+
211
+ // 如果事件处理器设置了cancel为true,则取消操作
212
+ if (beforeEventData.cancel) {
213
+ resolve(0);
214
+ return;
215
+ }
216
+
217
+ // 获取当前值或默认为空字符串
218
+ const obj = this.data[key];
219
+ let currentValue = '';
220
+ if (obj) {
221
+ currentValue = String(obj.value);
222
+ }
223
+
224
+ // 执行字符串拼接
225
+ const newValue = currentValue + String(value);
226
+ const result = newValue.length;
227
+
228
+ // 保存结果
229
+ this.data[key] = { value: newValue, expire: 0 };
230
+
231
+ // 如果键不存在于列表中,添加到列表
232
+ if (!this.list.includes(key)) {
233
+ this.list.push(key);
234
+ }
235
+
236
+ // 触发后置事件
237
+ this.emit('append_after', {
238
+ key,
239
+ value,
240
+ result
241
+ });
242
+ resolve(result);
243
+ } catch (error) {
244
+ // 触发错误事件
245
+ this.emit('append_error', {
246
+ key,
247
+ value,
248
+ error
249
+ });
250
+ $.log.error('[cachebase] append操作失败:', error);
251
+ resolve(0);
252
+ }
253
+ });
254
+ }
255
+
256
+ // Redis兼容的strlen方法
257
+ async strlen(key) {
258
+ return new Promise((resolve) => {
259
+ try {
260
+ // 触发前置事件
261
+ const beforeEventData = {
262
+ key,
263
+ cancel: false
264
+ };
265
+ this.emit('strlen_before', beforeEventData);
266
+
267
+ // 如果事件处理器设置了cancel为true,则取消操作
268
+ if (beforeEventData.cancel) {
269
+ resolve(0);
270
+ return;
271
+ }
272
+
273
+ // 执行实际操作
274
+ const obj = this.data[key];
275
+ let result = 0;
276
+ if (obj) {
277
+ result = String(obj.value).length;
278
+ }
279
+
280
+ // 触发后置事件
281
+ this.emit('strlen_after', {
282
+ key,
283
+ result
284
+ });
285
+ resolve(result);
286
+ } catch (error) {
287
+ // 触发错误事件
288
+ this.emit('strlen_error', {
289
+ key,
290
+ error
291
+ });
292
+ $.log.error('[cachebase] strlen操作失败:', error);
293
+ resolve(0);
294
+ }
295
+ });
296
+ }
297
+
298
+ // 哈希表设置方法 - 模拟实现
299
+ async hset(key, field, value) {
300
+ return new Promise((resolve) => {
301
+ try {
302
+ // 触发前置事件,将field作为value的一部分
303
+ const beforeEventData = {
304
+ key,
305
+ value: { field, value },
306
+ cancel: false
307
+ };
308
+ this.emit('hset_before', beforeEventData);
309
+
310
+ // 如果事件处理器设置了cancel为true,则取消操作
311
+ if (beforeEventData.cancel) {
312
+ resolve(0);
313
+ return;
314
+ }
315
+
316
+ // 确保哈希表存在
317
+ if (!this.data[key]) {
318
+ this.data[key] = { value: {}, expire: 0 };
319
+ // 添加到列表
320
+ if (!this.list.includes(key)) {
321
+ this.list.push(key);
322
+ }
323
+ } else if (typeof this.data[key].value !== 'object') {
324
+ this.data[key].value = {};
325
+ }
326
+
327
+ // 记录是否是新字段
328
+ const isNewField = !this.data[key].value.hasOwnProperty(field);
329
+
330
+ // 设置字段值
331
+ this.data[key].value[field] = value;
332
+
333
+ // 触发后置事件
334
+ this.emit('hset_after', {
335
+ key,
336
+ value: { field, value },
337
+ result: isNewField ? 1 : 0
338
+ });
339
+ resolve(isNewField ? 1 : 0);
340
+ } catch (error) {
341
+ // 触发错误事件
342
+ this.emit('hset_error', {
343
+ key,
344
+ value: { field, value },
345
+ error
346
+ });
347
+ $.log.error('[cachebase] hset操作失败:', error);
348
+ resolve(0);
349
+ }
350
+ });
351
+ }
352
+
353
+ // 哈希表获取字段值方法 - 模拟实现
354
+ async hget(key, field) {
355
+ return new Promise((resolve) => {
356
+ try {
357
+ // 触发前置事件
358
+ const beforeEventData = {
359
+ key,
360
+ value: { field },
361
+ cancel: false
362
+ };
363
+ this.emit('hget_before', beforeEventData);
364
+
365
+ // 如果事件处理器设置了cancel为true,则取消操作
366
+ if (beforeEventData.cancel) {
367
+ resolve(null);
368
+ return;
369
+ }
370
+
371
+ // 执行实际操作
372
+ const obj = this.data[key];
373
+ let result = null;
374
+ if (obj && typeof obj.value === 'object' && field in obj.value) {
375
+ result = obj.value[field];
376
+ }
377
+
378
+ // 触发后置事件
379
+ this.emit('hget_after', {
380
+ key,
381
+ value: { field },
382
+ result
383
+ });
384
+ resolve(result);
385
+ } catch (error) {
386
+ // 触发错误事件
387
+ this.emit('hget_error', {
388
+ key,
389
+ value: { field },
390
+ error
391
+ });
392
+ $.log.error('[cachebase] hget操作失败:', error);
393
+ resolve(null);
394
+ }
395
+ });
396
+ }
397
+
398
+ // 哈希表获取所有字段和值方法 - 模拟实现
399
+ async hgetall(key) {
400
+ return new Promise((resolve) => {
401
+ try {
402
+ // 触发前置事件
403
+ const beforeEventData = {
404
+ key,
405
+ cancel: false
406
+ };
407
+ this.emit('hgetall_before', beforeEventData);
408
+
409
+ // 如果事件处理器设置了cancel为true,则取消操作
410
+ if (beforeEventData.cancel) {
411
+ resolve({});
412
+ return;
413
+ }
414
+
415
+ // 执行实际操作
416
+ const obj = this.data[key];
417
+ let result = {};
418
+ if (obj && typeof obj.value === 'object') {
419
+ result = {...obj.value};
420
+ }
421
+
422
+ // 触发后置事件
423
+ this.emit('hgetall_after', {
424
+ key,
425
+ result
426
+ });
427
+ resolve(result);
428
+ } catch (error) {
429
+ // 触发错误事件
430
+ this.emit('hgetall_error', {
431
+ key,
432
+ error
433
+ });
434
+ $.log.error('[cachebase] hgetall操作失败:', error);
435
+ resolve({});
436
+ }
437
+ });
438
+ }
439
+
440
+ // 哈希表删除字段方法 - 模拟实现
441
+ async hdel(key, field) {
442
+ return new Promise((resolve) => {
443
+ try {
444
+ // 触发前置事件
445
+ const beforeEventData = {
446
+ key,
447
+ value: { field },
448
+ cancel: false
449
+ };
450
+ this.emit('hdel_before', beforeEventData);
451
+
452
+ // 如果事件处理器设置了cancel为true,则取消操作
453
+ if (beforeEventData.cancel) {
454
+ resolve(0);
455
+ return;
456
+ }
457
+
458
+ // 执行实际操作
459
+ let result = 0;
460
+ const obj = this.data[key];
461
+ if (obj && typeof obj.value === 'object' && field in obj.value) {
462
+ delete obj.value[field];
463
+ // 如果哈希表变空了,删除整个键
464
+ if (Object.keys(obj.value).length === 0) {
465
+ delete this.data[key];
466
+ const index = this.list.indexOf(key);
467
+ if (index > -1) {
468
+ this.list.splice(index, 1);
469
+ }
470
+ }
471
+ result = 1;
472
+ }
473
+
474
+ // 触发后置事件
475
+ this.emit('hdel_after', {
476
+ key,
477
+ value: { field },
478
+ result
479
+ });
480
+ resolve(result);
481
+ } catch (error) {
482
+ // 触发错误事件
483
+ this.emit('hdel_error', {
484
+ key,
485
+ value: { field },
486
+ error
487
+ });
488
+ $.log.error('[cachebase] hdel操作失败:', error);
489
+ resolve(0);
490
+ }
491
+ });
492
+ }
493
+
494
+ // 修复的mset方法 - Redis兼容格式
495
+ async mset(...args) {
496
+ return new Promise((resolve) => {
497
+ try {
498
+ // 触发前置事件,将args作为value的一部分
499
+ const beforeEventData = {
500
+ value: { args },
501
+ cancel: false
502
+ };
503
+ this.emit('mset_before', beforeEventData);
504
+
505
+ // 如果事件处理器设置了cancel为true,则取消操作
506
+ if (beforeEventData.cancel) {
507
+ resolve(null);
508
+ return;
509
+ }
510
+
511
+ // 参数校验
512
+ if (args.length % 2 !== 0) {
513
+ $.log.error('[cachebase] mset参数数量不正确');
514
+ resolve('ERR');
515
+ return;
516
+ }
517
+
518
+ // 执行实际操作
519
+ for (let i = 0; i < args.length; i += 2) {
520
+ const key = args[i];
521
+ const value = args[i + 1];
522
+ this.data[key] = { value, expire: 0 };
523
+ // 添加到列表
524
+ if (!this.list.includes(key)) {
525
+ this.list.push(key);
526
+ }
527
+ }
528
+
529
+ // 触发后置事件
530
+ this.emit('mset_after', {
531
+ value: { args },
532
+ result: 'OK'
533
+ });
534
+ resolve('OK');
535
+ } catch (error) {
536
+ // 触发错误事件
537
+ this.emit('mset_error', {
538
+ value: { args },
539
+ error
540
+ });
541
+ $.log.error('[cachebase] mset操作失败:', error);
542
+ resolve('ERR');
543
+ }
544
+ });
545
+ }
546
+
547
+ // 修复的mget方法 - 返回数组格式,与Redis保持一致
548
+ async mget(...keys) {
549
+ return new Promise((resolve) => {
550
+ try {
551
+ // 触发前置事件
552
+ const beforeEventData = {
553
+ value: { keys },
554
+ cancel: false
555
+ };
556
+ this.emit('mget_before', beforeEventData);
557
+
558
+ // 如果事件处理器设置了cancel为true,则取消操作
559
+ if (beforeEventData.cancel) {
560
+ resolve([]);
561
+ return;
562
+ }
563
+
564
+ // 执行实际操作 - 返回数组格式,与Redis保持一致
565
+ const result = keys.map(key => {
566
+ const obj = this.data[key];
567
+ return obj ? obj.value : null;
568
+ });
569
+
570
+ // 触发后置事件
571
+ this.emit('mget_after', {
572
+ value: { keys },
573
+ result
574
+ });
575
+ resolve(result);
576
+ } catch (error) {
577
+ // 触发错误事件
578
+ this.emit('mget_error', {
579
+ value: { keys },
580
+ error
581
+ });
582
+ $.log.error('[cachebase] mget操作失败:', error);
583
+ resolve([]);
584
+ }
585
+ });
586
+ }
587
+
588
+ // Redis兼容的exists方法,支持多个键
589
+ async exists(...keys) {
590
+ return new Promise((resolve) => {
591
+ try {
592
+ // 触发前置事件
593
+ const beforeEventData = {
594
+ value: { keys },
595
+ cancel: false
596
+ };
597
+ this.emit('exists_before', beforeEventData);
598
+
599
+ // 如果事件处理器设置了cancel为true,则取消操作
600
+ if (beforeEventData.cancel) {
601
+ resolve(0);
602
+ return;
603
+ }
604
+
605
+ // 执行实际操作
606
+ const result = keys.filter(key => key in this.data).length;
607
+
608
+ // 触发后置事件
609
+ this.emit('exists_after', {
610
+ value: { keys },
611
+ result
612
+ });
613
+ resolve(result);
614
+ } catch (error) {
615
+ // 触发错误事件
616
+ this.emit('exists_error', {
617
+ value: { keys },
618
+ error
619
+ });
620
+ $.log.error('[cachebase] exists操作失败:', error);
621
+ resolve(0);
622
+ }
623
+ });
624
+ }
625
+
626
+ // 查询/设置过期时间方法,包含事件触发
627
+ async ttl(key) {
628
+ return new Promise((resolve) => {
629
+ try {
630
+ // 触发前置事件
631
+ const beforeEventData = {
632
+ key,
633
+ cancel: false
634
+ };
635
+ this.emit('ttl_before', beforeEventData);
636
+
637
+ // 如果事件处理器设置了cancel为true,则取消操作
638
+ if (beforeEventData.cancel) {
639
+ resolve(-2);
640
+ return;
641
+ }
642
+
643
+ // 执行实际操作
644
+ const obj = this.data[key];
645
+ let result;
646
+
647
+ if (!obj) {
648
+ result = -2; // 键不存在
649
+ } else {
650
+ // 查询过期时间
651
+ if (obj.expire === 0) {
652
+ result = -1; // 永不过期
653
+ } else {
654
+ const remaining = Math.floor((obj.expire - Date.now()) / 1000);
655
+ result = remaining > 0 ? remaining : -2; // -2表示已过期
656
+ }
657
+ }
658
+
659
+ // 触发后置事件
660
+ this.emit('ttl_after', {
661
+ key,
662
+ result
663
+ });
664
+ resolve(result);
665
+ } catch (error) {
666
+ // 触发错误事件
667
+ this.emit('ttl_error', {
668
+ key,
669
+ error
670
+ });
671
+ $.log.error('[cachebase] ttl操作失败:', error);
672
+ resolve(-2);
673
+ }
674
+ });
675
+ }
676
+
677
+ // Redis兼容的expire方法
678
+ async expire(key, seconds) {
679
+ return new Promise((resolve) => {
680
+ try {
681
+ // 触发前置事件
682
+ const beforeEventData = {
683
+ key,
684
+ value: { seconds },
685
+ cancel: false
686
+ };
687
+ this.emit('expire_before', beforeEventData);
688
+
689
+ // 如果事件处理器设置了cancel为true,则取消操作
690
+ if (beforeEventData.cancel) {
691
+ resolve(0);
692
+ return;
693
+ }
694
+
695
+ // 执行实际操作
696
+ const obj = this.data[key];
697
+ let result = 0;
698
+
699
+ if (obj) {
700
+ if (seconds === 0) {
701
+ obj.expire = 0; // 永不过期
702
+ } else {
703
+ obj.expire = Date.now() + (parseInt(seconds, 10) * 1000);
704
+ }
705
+ result = 1;
706
+ }
707
+
708
+ // 触发后置事件
709
+ this.emit('expire_after', {
710
+ key,
711
+ value: { seconds },
712
+ result
713
+ });
714
+ resolve(result);
715
+ } catch (error) {
716
+ // 触发错误事件
717
+ this.emit('expire_error', {
718
+ key,
719
+ value: { seconds },
720
+ error
721
+ });
722
+ $.log.error('[cachebase] expire操作失败:', error);
723
+ resolve(0);
724
+ }
725
+ });
726
+ }
727
+
728
+ // Redis兼容的persist方法
729
+ async persist(key) {
730
+ return new Promise((resolve) => {
731
+ try {
732
+ // 触发前置事件
733
+ const beforeEventData = {
734
+ key,
735
+ cancel: false
736
+ };
737
+ this.emit('persist_before', beforeEventData);
738
+
739
+ // 如果事件处理器设置了cancel为true,则取消操作
740
+ if (beforeEventData.cancel) {
741
+ resolve(0);
742
+ return;
743
+ }
744
+
745
+ // 执行实际操作
746
+ const obj = this.data[key];
747
+ let result = 0;
748
+
749
+ if (obj && obj.expire !== 0) {
750
+ obj.expire = 0; // 移除过期时间
751
+ result = 1;
752
+ }
753
+
754
+ // 触发后置事件
755
+ this.emit('persist_after', {
756
+ key,
757
+ result
758
+ });
759
+ resolve(result);
760
+ } catch (error) {
761
+ // 触发错误事件
762
+ this.emit('persist_error', {
763
+ key,
764
+ error
765
+ });
766
+ $.log.error('[cachebase] persist操作失败:', error);
767
+ resolve(0);
768
+ }
769
+ });
770
+ }
771
+
772
+ // 获取所有匹配键方法,包含事件触发
773
+ async keys(pattern) {
774
+ return new Promise((resolve) => {
775
+ try {
776
+ // 触发前置事件
777
+ const beforeEventData = {
778
+ value: { pattern },
779
+ cancel: false
780
+ };
781
+ this.emit('keys_before', beforeEventData);
782
+
783
+ // 如果事件处理器设置了cancel为true,则取消操作
784
+ if (beforeEventData.cancel) {
785
+ resolve([]);
786
+ return;
787
+ }
788
+
789
+ // 执行实际操作
790
+ let result;
791
+ if (!pattern || pattern === '*') {
792
+ result = [...this.list];
793
+ } else {
794
+ // 转换模式为正则表达式
795
+ const regexPattern = pattern
796
+ .replace(/\./g, '\\.')
797
+ .replace(/\*/g, '.*')
798
+ .replace(/\?/g, '.');
799
+ const regex = new RegExp(`^${regexPattern}$`);
800
+
801
+ // 过滤匹配的键
802
+ result = this.list.filter(key => regex.test(key));
803
+ }
804
+
805
+ // 触发后置事件
806
+ this.emit('keys_after', {
807
+ value: { pattern },
808
+ result
809
+ });
810
+ resolve(result);
811
+ } catch (error) {
812
+ // 触发错误事件
813
+ this.emit('keys_error', {
814
+ value: { pattern },
815
+ error
816
+ });
817
+ $.log.error('[cachebase] keys操作失败:', error);
818
+ resolve([]);
819
+ }
820
+ });
821
+ }
822
+
823
+ // Redis兼容的dbsize方法
824
+ async dbsize() {
825
+ return new Promise((resolve) => {
826
+ try {
827
+ // 触发前置事件
828
+ const beforeEventData = {
829
+ cancel: false
830
+ };
831
+ this.emit('dbsize_before', beforeEventData);
832
+
833
+ // 如果事件处理器设置了cancel为true,则取消操作
834
+ if (beforeEventData.cancel) {
835
+ resolve(0);
836
+ return;
837
+ }
838
+
839
+ // 执行实际操作
840
+ const result = this.list.length;
841
+
842
+ // 触发后置事件
843
+ this.emit('dbsize_after', {
844
+ result
845
+ });
846
+ resolve(result);
847
+ } catch (error) {
848
+ // 触发错误事件
849
+ this.emit('dbsize_error', {
850
+ error
851
+ });
852
+ $.log.error('[cachebase] dbsize操作失败:', error);
853
+ resolve(0);
854
+ }
855
+ });
856
+ }
857
+
858
+ // Redis兼容的flushdb方法
859
+ async flushdb() {
860
+ return new Promise((resolve) => {
861
+ try {
862
+ // 触发前置事件
863
+ const beforeEventData = {
864
+ cancel: false
865
+ };
866
+ this.emit('flushdb_before', beforeEventData);
867
+
868
+ // 如果事件处理器设置了cancel为true,则取消操作
869
+ if (beforeEventData.cancel) {
870
+ resolve(null);
871
+ return;
872
+ }
873
+
874
+ // 执行实际操作
875
+ this.data = {};
876
+ this.list = [];
877
+ this.dict = this.data; // 同步dict引用
878
+
879
+ // 触发后置事件
880
+ this.emit('flushdb_after', {
881
+ result: 'OK'
882
+ });
883
+ resolve('OK');
884
+ } catch (error) {
885
+ // 触发错误事件
886
+ this.emit('flushdb_error', {
887
+ error
888
+ });
889
+ $.log.error('[cachebase] flushdb操作失败:', error);
890
+ resolve(null);
891
+ }
892
+ });
893
+ }
894
+
895
+ // Redis兼容的incr方法
896
+ async incr(key) {
897
+ return new Promise((resolve) => {
898
+ try {
899
+ // 触发前置事件
900
+ const beforeEventData = {
901
+ key,
902
+ cancel: false
903
+ };
904
+ this.emit('incr_before', beforeEventData);
905
+
906
+ // 如果事件处理器设置了cancel为true,则取消操作
907
+ if (beforeEventData.cancel) {
908
+ resolve(0);
909
+ return;
910
+ }
911
+
912
+ // 获取当前值或默认为0
913
+ let currentValue = 0;
914
+ if (this.data[key] && !isNaN(this.data[key].value)) {
915
+ currentValue = parseInt(this.data[key].value, 10);
916
+ }
917
+
918
+ // 执行递增
919
+ const result = currentValue + 1;
920
+
921
+ // 保存结果
922
+ this.data[key] = { value: result, expire: 0 };
923
+
924
+ // 如果键不存在于列表中,添加到列表
925
+ if (!this.list.includes(key)) {
926
+ this.list.push(key);
927
+ }
928
+
929
+ // 触发后置事件
930
+ this.emit('incr_after', {
931
+ key,
932
+ result
933
+ });
934
+ resolve(result);
935
+ } catch (error) {
936
+ // 触发错误事件
937
+ this.emit('incr_error', {
938
+ key,
939
+ error
940
+ });
941
+ $.log.error('[cachebase] incr操作失败:', error);
942
+ resolve(0);
943
+ }
944
+ });
945
+ }
946
+
947
+ // Redis兼容的decr方法
948
+ async decr(key) {
949
+ return new Promise((resolve) => {
950
+ try {
951
+ // 触发前置事件
952
+ const beforeEventData = {
953
+ key,
954
+ cancel: false
955
+ };
956
+ this.emit('decr_before', beforeEventData);
957
+
958
+ // 如果事件处理器设置了cancel为true,则取消操作
959
+ if (beforeEventData.cancel) {
960
+ resolve(0);
961
+ return;
962
+ }
963
+
964
+ // 获取当前值或默认为0
965
+ let currentValue = 0;
966
+ if (this.data[key] && !isNaN(this.data[key].value)) {
967
+ currentValue = parseInt(this.data[key].value, 10);
968
+ }
969
+
970
+ // 执行递减
971
+ const result = currentValue - 1;
972
+
973
+ // 保存结果
974
+ this.data[key] = { value: result, expire: 0 };
975
+
976
+ // 如果键不存在于列表中,添加到列表
977
+ if (!this.list.includes(key)) {
978
+ this.list.push(key);
979
+ }
980
+
981
+ // 触发后置事件
982
+ this.emit('decr_after', {
983
+ key,
984
+ result
985
+ });
986
+ resolve(result);
987
+ } catch (error) {
988
+ // 触发错误事件
989
+ this.emit('decr_error', {
990
+ key,
991
+ error
992
+ });
993
+ $.log.error('[cachebase] decr操作失败:', error);
994
+ resolve(0);
995
+ }
996
+ });
997
+ }
998
+
999
+ // Redis兼容的incrby方法
1000
+ async incrby(key, increment) {
1001
+ return new Promise((resolve) => {
1002
+ try {
1003
+ // 触发前置事件
1004
+ const beforeEventData = {
1005
+ key,
1006
+ value: { increment },
1007
+ cancel: false
1008
+ };
1009
+ this.emit('incrby_before', beforeEventData);
1010
+
1011
+ // 如果事件处理器设置了cancel为true,则取消操作
1012
+ if (beforeEventData.cancel) {
1013
+ resolve(0);
1014
+ return;
1015
+ }
1016
+
1017
+ // 获取当前值或默认为0
1018
+ let currentValue = 0;
1019
+ if (this.data[key] && !isNaN(this.data[key].value)) {
1020
+ currentValue = parseInt(this.data[key].value, 10);
1021
+ }
1022
+
1023
+ // 执行递增
1024
+ const result = currentValue + parseInt(increment, 10);
1025
+
1026
+ // 保存结果
1027
+ this.data[key] = { value: result, expire: 0 };
1028
+
1029
+ // 如果键不存在于列表中,添加到列表
1030
+ if (!this.list.includes(key)) {
1031
+ this.list.push(key);
1032
+ }
1033
+
1034
+ // 触发后置事件
1035
+ this.emit('incrby_after', {
1036
+ key,
1037
+ value: { increment },
1038
+ result
1039
+ });
1040
+ resolve(result);
1041
+ } catch (error) {
1042
+ // 触发错误事件
1043
+ this.emit('incrby_error', {
1044
+ key,
1045
+ value: { increment },
1046
+ error
1047
+ });
1048
+ $.log.error('[cachebase] incrby操作失败:', error);
1049
+ resolve(0);
1050
+ }
1051
+ });
1052
+ }
1053
+
1054
+ // Redis兼容的decrby方法
1055
+ async decrby(key, decrement) {
1056
+ return new Promise((resolve) => {
1057
+ try {
1058
+ // 触发前置事件
1059
+ const beforeEventData = {
1060
+ key,
1061
+ value: { decrement },
1062
+ cancel: false
1063
+ };
1064
+ this.emit('decrby_before', beforeEventData);
1065
+
1066
+ // 如果事件处理器设置了cancel为true,则取消操作
1067
+ if (beforeEventData.cancel) {
1068
+ resolve(0);
1069
+ return;
1070
+ }
1071
+
1072
+ // 获取当前值或默认为0
1073
+ let currentValue = 0;
1074
+ if (this.data[key] && !isNaN(this.data[key].value)) {
1075
+ currentValue = parseInt(this.data[key].value, 10);
1076
+ }
1077
+
1078
+ // 执行递减
1079
+ const result = currentValue - parseInt(decrement, 10);
1080
+
1081
+ // 保存结果
1082
+ this.data[key] = { value: result, expire: 0 };
1083
+
1084
+ // 如果键不存在于列表中,添加到列表
1085
+ if (!this.list.includes(key)) {
1086
+ this.list.push(key);
1087
+ }
1088
+
1089
+ // 触发后置事件
1090
+ this.emit('decrby_after', {
1091
+ key,
1092
+ value: { decrement },
1093
+ result
1094
+ });
1095
+ resolve(result);
1096
+ } catch (error) {
1097
+ // 触发错误事件
1098
+ this.emit('decrby_error', {
1099
+ key,
1100
+ value: { decrement },
1101
+ error
1102
+ });
1103
+ $.log.error('[cachebase] decrby操作失败:', error);
1104
+ resolve(0);
1105
+ }
1106
+ });
1107
+ }
1108
+
1109
+ // Redis兼容的incrbyfloat方法
1110
+ async incrbyfloat(key, increment) {
1111
+ return new Promise((resolve) => {
1112
+ try {
1113
+ // 触发前置事件
1114
+ const beforeEventData = {
1115
+ key,
1116
+ value: { increment },
1117
+ cancel: false
1118
+ };
1119
+ this.emit('incrbyfloat_before', beforeEventData);
1120
+
1121
+ // 如果事件处理器设置了cancel为true,则取消操作
1122
+ if (beforeEventData.cancel) {
1123
+ resolve(0);
1124
+ return;
1125
+ }
1126
+
1127
+ // 获取当前值或默认为0
1128
+ let currentValue = 0;
1129
+ if (this.data[key] && !isNaN(this.data[key].value)) {
1130
+ currentValue = parseFloat(this.data[key].value);
1131
+ }
1132
+
1133
+ // 执行浮点递增
1134
+ const result = currentValue + parseFloat(increment);
1135
+
1136
+ // 保存结果
1137
+ this.data[key] = { value: result, expire: 0 };
1138
+
1139
+ // 如果键不存在于列表中,添加到列表
1140
+ if (!this.list.includes(key)) {
1141
+ this.list.push(key);
1142
+ }
1143
+
1144
+ // 触发后置事件
1145
+ this.emit('incrbyfloat_after', {
1146
+ key,
1147
+ value: { increment },
1148
+ result
1149
+ });
1150
+ resolve(result);
1151
+ } catch (error) {
1152
+ // 触发错误事件
1153
+ this.emit('incrbyfloat_error', {
1154
+ key,
1155
+ value: { increment },
1156
+ error
1157
+ });
1158
+ $.log.error('[cachebase] incrbyfloat操作失败:', error);
1159
+ resolve(0);
1160
+ }
1161
+ });
1162
+ }
1163
+
1164
+ // 保持兼容性的方法
1165
+ async has(key) {
1166
+ return this.exists(key);
1167
+ }
1168
+
1169
+ async clear(pattern) {
1170
+ return this.flushdb();
1171
+ }
1172
+
1173
+ async add(key, value) {
1174
+ return this.incrby(key, value);
1175
+ }
1176
+
1177
+ async addFloat(key, value) {
1178
+ return this.incrbyfloat(key, value);
1179
+ }
1180
+
1181
+ async addStr(key, value) {
1182
+ return this.append(key, value);
1183
+ }
1184
+
1185
+ // 资源销毁方法,包含事件触发
1186
+ dispose() {
1187
+ try {
1188
+ // 触发前置事件
1189
+ const beforeEventData = { cancel: false };
1190
+ this.emit('dispose_before', beforeEventData);
1191
+
1192
+ // 如果事件处理器设置了cancel为true,则取消操作
1193
+ if (beforeEventData.cancel) {
1194
+ return;
1195
+ }
1196
+
1197
+ // 执行实际操作
1198
+ this.data = {};
1199
+ this.list = [];
1200
+ this.dict = this.data; // 同步dict引用
1201
+
1202
+ // 触发后置事件
1203
+ this.emit('dispose_after', {});
1204
+
1205
+ // 最后移除所有监听器(在触发后置事件后)
1206
+ this.removeAllListeners();
1207
+ } catch (error) {
1208
+ // 触发错误事件
1209
+ this.emit('dispose_error', { error });
1210
+ $.log.error('[cachebase] dispose操作失败:', error);
1211
+ }
1212
+ }
54
1213
  }
55
1214
 
56
- /**
57
- * @description 获取缓存对象
58
- * @param {String} key 键
59
- * @return {String} 对象
60
- */
61
- CacheBase.prototype.getObj = function(key) {
62
- var obj = this.dict[key];
63
- if (obj && obj.expires) {
64
- var cha = obj.expires - new Date().stamp();
65
- if (cha < 1) {
66
- this.delObj(key);
67
- obj = undefined;
68
- }
69
- }
70
- return obj;
71
- };
72
- /**
73
- * @description 删除缓存对象
74
- * @param {String} key 键
75
- * @return {Number} 成功返回1,否则返回0
76
- */
77
- CacheBase.prototype.delObj = function(key) {
78
- delete this.dict[key];
79
- return 1;
80
- };
81
-
82
- /**
83
- * @description 设置缓存对象
84
- * @param {Object} obj 值
85
- * @return {Number} 成功返回1,否则返回0
86
- */
87
- CacheBase.prototype.addObj = function(obj) {
88
- // obj.id = obj.name.md5();
89
- var maxAge = obj.maxAge;
90
- if (maxAge > 0) {
91
- // 如果maxAge大于0则设置缓存时长
92
- obj.expires = new Date().addSeconds(maxAge).stamp();
93
- } else {
94
- obj.maxAge = -1;
95
- obj.expires = null;
96
- }
97
- this.dict[obj.name] = obj;
98
- return 1;
99
- };
100
-
101
- /**
102
- * @description 查询或是设置缓存过期时间
103
- * @param {String} key 键
104
- * @param {Number} maxAge 秒, 为空则查询有效时长
105
- * @return {Promise|Number|Boolean} 查询时长或设置结果, 时长为-1表示永不过期
106
- */
107
- CacheBase.prototype.ttl = async function(key, maxAge) {
108
- var _this = this;
109
- return new Promise((resolve, reject) => {
110
- var obj = _this.getObj(key);
111
- if (obj) {
112
- if (maxAge === undefined) {
113
- // 如果maxAge没有设置则查询时长
114
- if (obj.expires) {
115
- // 如果有效期
116
- var cha = Date.parse(obj.expires) - Date.parse(new Date());
117
- maxAge = parseInt(cha / 1000);
118
- } else {
119
- maxAge = obj.maxAge;
120
- }
121
- resolve(maxAge);
122
- return;
123
- } else if (maxAge > 0) {
124
- // 如果maxAge大于0则设置缓存时长
125
- obj.maxAge = maxAge;
126
- obj.expires = new Date().addSeconds(maxAge).stamp();
127
- } else if (maxAge < 0) {
128
- // 如果maxAge小于0则设置缓存时长为永久
129
- obj.maxAge = -1;
130
- obj.expires = null;
131
- } else {
132
- // 如果maxAge等于0则设置删除缓存
133
- _this.delObj(key);
134
- }
135
- resolve(1);
136
- } else {
137
- resolve(0);
138
- }
139
- });
140
- };
141
- /**
142
- * @description 增加整数值(负数为减)
143
- * @param {String} key 键
144
- * @param {Number} num 数值
145
- * @return {Promise|Number} 计算后的结果
146
- */
147
- CacheBase.prototype.addInt = async function(key, num) {
148
- var _this = this;
149
- return new Promise((resolve, reject) => {
150
- var obj = _this.getObj(key);
151
- if (obj) {
152
- obj.value += num;
153
- resolve(obj.value);
154
- } else {
155
- resolve(0);
156
- }
157
- });
158
- };
159
- /**
160
- * @description 增加浮点数值(负数为减)
161
- * @param {String} key 键
162
- * @param {Number} num 数值
163
- * @return {Promise|Number} 计算后的结果
164
- */
165
- CacheBase.prototype.addFloat = async function(key, num) {
166
- var _this = this;
167
- return new Promise((resolve, reject) => {
168
- var obj = _this.getObj(key);
169
- if (obj) {
170
- obj.value += num;
171
- resolve(obj.value);
172
- } else {
173
- resolve(0);
174
- }
175
- });
176
- };
177
- /**
178
- * @description 增加字符串值到指定缓存
179
- * @param {String} key 键
180
- * @param {String} str 添加的字符串
181
- * @return {Promise|String} 添加后的字符串
182
- */
183
- CacheBase.prototype.addStr = async function(key, str) {
184
- var _this = this;
185
- return new Promise((resolve, reject) => {
186
- var obj = _this.getObj(key);
187
- if (obj) {
188
- obj.value += str;
189
- resolve(obj.value);
190
- } else {
191
- resolve(0);
192
- }
193
- });
194
- };
195
- /**
196
- * @description 删除缓存
197
- * @param {String} key 键
198
- * @return {Promise|Boolean} 成功返回true,失败返回false
199
- */
200
- CacheBase.prototype.del = async function(key) {
201
- var _this = this;
202
- return new Promise((resolve, reject) => {
203
- var ret = _this.delObj(key);
204
- resolve(ret);
205
- });
206
- };
207
- /**
208
- * @description 修改缓存
209
- * @param {String} key 键
210
- * @param {Object} value 值
211
- * @param {Number} maxAge 秒
212
- * @return {Object} 值
213
- */
214
- CacheBase.prototype.setVal = function(key, value, maxAge) {
215
- var _this = this;
216
- var obj = _this.getObj(key);
217
- if (obj) {
218
- obj.value = value;
219
- if (maxAge !== undefined) {
220
- _this.ttl(key, maxAge);
221
- }
222
- } else {
223
- if (maxAge === undefined) {
224
- maxAge = -1;
225
- }
226
- obj = {
227
- name: key,
228
- value: value,
229
- maxAge: maxAge
230
- };
231
- _this.addObj(obj);
232
- }
233
- return obj.value;
234
- };
235
- /**
236
- * @description 修改缓存
237
- * @param {String} key 键
238
- * @param {Object} value 值
239
- * @param {Number} maxAge 秒
240
- * @return {Promise|Object} 值
241
- */
242
- CacheBase.prototype.set = async function(key, value, maxAge) {
243
- var _this = this;
244
- return new Promise((resolve, reject) => {
245
- var ret = _this.setVal(key, value, maxAge);
246
- resolve(ret);
247
- });
248
- };
249
- /**
250
- * @description 增加缓存 增加缓存和修改缓存不一样, 如果键存在则不会增加
251
- * @param {String} key 键
252
- * @param {Object} value 值
253
- * @param {Number} maxAge 秒
254
- * @return {Promise<Object>} 添加成功返回值, 如果已存在则返回null
255
- */
256
- CacheBase.prototype.add = async function(key, value, maxAge) {
257
- var _this = this;
258
- return new Promise((resolve, reject) => {
259
- var obj = _this.getObj(key);
260
- if (!obj) {
261
- var ret = _this.setVal(key, value, maxAge);
262
- resolve(ret);
263
- } else {
264
- resolve(0);
265
- }
266
- });
267
- };
268
- /**
269
- * @description 查询缓存
270
- * @param {String} key 键
271
- * @return {Promise|Object} 查询值
272
- */
273
- CacheBase.prototype.get = async function(key) {
274
- var _this = this;
275
- return new Promise((resolve, reject) => {
276
- var obj = _this.getObj(key);
277
- if (obj) {
278
- resolve(obj.value);
279
- } else {
280
- resolve(undefined);
281
- }
282
- });
283
- };
284
- /**
285
- * @description 判断键是否存在
286
- * @param {String} key 键
287
- * @return {Promise|Boolean} 有返回true, 没有返回false
288
- */
289
- CacheBase.prototype.has = async function(key) {
290
- var _this = this;
291
- return new Promise((resolve, reject) => {
292
- var obj = _this.getObj(key);
293
- resolve(obj ? 1 : 0);
294
- });
295
- };
296
- /**
297
- * @description 查询缓存的字符串中的一段字符串
298
- * @param {String} key 键
299
- * @param {Number} start 开始位置
300
- * @param {Number} end 结束位置
301
- * @return {Promise|String} 查询值
302
- */
303
- CacheBase.prototype.getrange = async function(key, start, end) {
304
- var _this = this;
305
- return new Promise((resolve, reject) => {
306
- var obj = _this.getObj(key);
307
- if (obj) {
308
- resolve(obj.value.substring(start, end));
309
- } else {
310
- resolve('');
311
- }
312
- });
313
- };
314
- /**
315
- * @description 在值的指定位置开始增加一段字符串
316
- * @param {String} key 键
317
- * @param {Number} index 开始位置
318
- * @param {String} value 变更的值
319
- * @return {Promise|Number} 字符串长度
320
- */
321
- CacheBase.prototype.setrange = async function(key, index, value) {
322
- var _this = this;
323
- return new Promise((resolve, reject) => {
324
- var obj = _this.getObj(key);
325
- if (obj) {
326
- var val = obj.value;
327
- var start = val.substring(0, index);
328
- var end = val.substring(index, val.length);
329
- obj.value = start + value + end;
330
- resolve(obj.value);
331
- } else {
332
- resolve('');
333
- }
334
- });
335
- };
336
- /**
337
- * @description 清空缓存
338
- * @param {String} key 键, 为空则清空所有
339
- * @return {Promise|Array} 执行结果
340
- */
341
- CacheBase.prototype.clear = async function(key) {
342
- var _this = this;
343
- return new Promise((resolve, reject) => {
344
- if (key) {
345
- var keys = Object.keys(this.dict);
346
- for (var i = 0; i < keys.length; i++) {
347
- var name = keys[i];
348
- if (name.has(key)) {
349
- _this.delObj(name);
350
- }
351
- }
352
- } else {
353
- this.dict = {};
354
- }
355
- resolve(1);
356
- });
357
- };
358
-
359
- /**
360
- * @description 排序
361
- * @param {String} key 键
362
- * @param {String} way = [asc|desc]排序方式, 可以为空
363
- * @param {String} obj_key 排序成员的键
364
- * @return {Promise|Array} 排序后的数组
365
- */
366
- CacheBase.prototype.sort = async function(key, way, obj_key) {
367
- var _this = this;
368
- return new Promise((resolve, reject) => {
369
- var obj = _this.getObj(key);
370
- if (obj) {
371
- if (obj.value.constructor == Array) {
372
- obj.value.sortBy(way, obj_key);
373
- resolve(1);
374
- } else {
375
- resolve(-1);
376
- }
377
- } else {
378
- resolve(0);
379
- }
380
- });
381
- };
382
-
383
- /**
384
- * @description 获取所有键名
385
- * @param {String} key 键 支持*号, 前面加*表示后面名称一致, 前后加*表示包含名称, 后面加*表示前面名称一致
386
- * @return {Promise|Array} 键数组
387
- */
388
- CacheBase.prototype.keys = async function(key) {
389
- var _this = this;
390
- return new Promise((resolve, reject) => {
391
- if (key) {
392
- var keys = Object.keys(this.dict);
393
- var list = [];
394
- for (var i = 0; i < keys.length; i++) {
395
- var name = keys[i];
396
- if (name.has(key)) {
397
- list.push(name);
398
- }
399
- }
400
- resolve(list.toArr('name'));
401
- } else {
402
- var keys = Object.keys(this.dict);
403
- resolve(keys);
404
- }
405
- });
406
- };
407
-
408
- /**
409
- * @description 修改数组缓存
410
- * @param {String} key 键
411
- * @param {Object} value 值
412
- * @param {Number} maxAge 秒
413
- * @return {Promise|Array} 执行结果
414
- */
415
- CacheBase.prototype.list_set = async function(key, value, maxAge) {
416
- var _this = this;
417
- return new Promise((resolve, reject) => {
418
- var ret = _this.setVal(key, value, maxAge);
419
- resolve(ret);
420
- });
421
- };
422
- /**
423
- * @description 数组缓存追加对象
424
- * @param {String} key 键
425
- * @param {Object} value 值
426
- * @return {Promise|String} 追加后的数组
427
- */
428
- CacheBase.prototype.list_add = async function(key, value) {
429
- var _this = this;
430
- return new Promise((resolve, reject) => {
431
- var obj = _this.getObj(key);
432
- if (obj) {
433
- var arr = obj.value;
434
- if (arr.constructor == Array) {
435
- arr.push(value);
436
- obj.value = arr;
437
- resolve(1);
438
- } else {
439
- _this.error = "当前缓存值非数组";
440
- resolve(-1);
441
- }
442
- } else {
443
- resolve(0);
444
- }
445
- });
446
- };
447
- /**
448
- * @description 判断成员是否存在
449
- * @param {String} key 键
450
- * @param {Object} value 值
451
- * @return {Promise|Boolean} 存在返回true, 否则返回false
452
- */
453
- CacheBase.prototype.list_has = async function(key, value) {
454
- var _this = this;
455
- return new Promise((resolve, reject) => {
456
- var obj = _this.getObj(key);
457
- if (obj) {
458
- if (obj.value.constructor == Array) {
459
- resolve(obj.value.has(value));
460
- } else {
461
- _this.error = "当前缓存值非数组";
462
- resolve(-1);
463
- }
464
- } else {
465
- resolve(0);
466
- }
467
- });
468
- };
469
- /**
470
- * @description 查询数组缓存
471
- * @param {String} key 键
472
- * @param {Number} start 起始位置
473
- * @param {Number} end 结束位置
474
- * @return {Promise|Array} 查询到的数组
475
- */
476
- CacheBase.prototype.list_get = async function(key, start, end) {
477
- var _this = this;
478
- return new Promise((resolve, reject) => {
479
- var obj = _this.getObj(key);
480
- if (obj) {
481
- if (obj.value.constructor == Array) {
482
- var lt = obj.value;
483
- if (!end) {
484
- end = lt.length;
485
- }
486
- if (!start) {
487
- start = 0;
488
- }
489
- var list = [];
490
- for (var i = start; i < end; i++) {
491
- list.push(lt[i]);
492
- }
493
- resolve(list);
494
- } else {
495
- _this.error = "当前缓存值非数组";
496
- resolve([]);
497
- }
498
- } else {
499
- resolve([]);
500
- }
501
- });
502
- };
503
- /**
504
- * @description 清空数组缓存
505
- * @param {String} key 键
506
- * @param {Array} value 新成员, 没有则删除数组
507
- * @return {Promise|Boolean} 成功返回true,是否返回false
508
- */
509
- CacheBase.prototype.list_clear = async function(key, value) {
510
- var _this = this;
511
- return new Promise((resolve, reject) => {
512
- if (value) {
513
- var obj = _this.getObj(key);
514
- if (obj) {
515
- obj.value = value;
516
- resolve(1);
517
- } else {
518
- resolve(0);
519
- }
520
- } else {
521
- var ret = _this.del(key);
522
- resolve(ret);
523
- }
524
- });
525
- };
526
- /**
527
- * @description 到期通知
528
- * @param {Object} obj 对象
529
- */
530
- CacheBase.prototype.notity = function(obj) {
531
- if (this.func) {
532
- this.func(obj);
533
- }
534
- };
535
-
536
- // 导出CacheBase函数
537
- module.exports = CacheBase;
1215
+ // 导出CacheBase类
1216
+ module.exports = CacheBase;
1217
+