mm_cachebase 1.4.4 → 1.4.6

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.
Files changed (4) hide show
  1. package/README.md +699 -15
  2. package/index.js +2129 -511
  3. package/package.json +2 -2
  4. package/test.js +16 -6
package/index.js CHANGED
@@ -1,514 +1,2132 @@
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.list = [];
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
- }
1
+ require('mm_logs');
2
+ const EventEmitter = require('events');
3
+
4
+ // 简化版的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(null);
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: 1
44
+ });
45
+ resolve(1);
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
+ // 哈希表设置方法
150
+ async hset(key, field, value) {
151
+ return new Promise((resolve) => {
152
+ try {
153
+ // 触发前置事件,将field作为value的一部分
154
+ const beforeEventData = {
155
+ key,
156
+ value: { field, value },
157
+ cancel: false
158
+ };
159
+ this.emit('hset_before', beforeEventData);
160
+
161
+ // 如果事件处理器设置了cancel为true,则取消操作
162
+ if (beforeEventData.cancel) {
163
+ resolve(0);
164
+ return;
165
+ }
166
+
167
+ // 确保哈希表存在
168
+ if (!this.data[key]) {
169
+ this.data[key] = { value: {}, expire: 0 };
170
+ // 添加到列表
171
+ if (!this.list.includes(key)) {
172
+ this.list.push(key);
173
+ }
174
+ } else if (typeof this.data[key].value !== 'object') {
175
+ this.data[key].value = {};
176
+ }
177
+
178
+ // 记录是否是新字段
179
+ const isNewField = !this.data[key].value.hasOwnProperty(field);
180
+
181
+ // 设置字段值
182
+ this.data[key].value[field] = value;
183
+
184
+ // 触发后置事件
185
+ this.emit('hset_after', {
186
+ key,
187
+ value: { field, value },
188
+ result: isNewField ? 1 : 0
189
+ });
190
+ resolve(isNewField ? 1 : 0);
191
+ } catch (error) {
192
+ // 触发错误事件
193
+ this.emit('hset_error', {
194
+ key,
195
+ value: { field, value },
196
+ error
197
+ });
198
+ $.log.error('[cachebase] hset操作失败:', error);
199
+ resolve(0);
200
+ }
201
+ });
202
+ }
203
+
204
+ // 列表头部推入方法
205
+ async lpush(key, ...values) {
206
+ return new Promise((resolve) => {
207
+ try {
208
+ // 触发前置事件,将values作为value的一部分
209
+ const beforeEventData = {
210
+ key,
211
+ value: { values },
212
+ cancel: false
213
+ };
214
+ this.emit('lpush_before', beforeEventData);
215
+
216
+ // 如果事件处理器设置了cancel为true,则取消操作
217
+ if (beforeEventData.cancel) {
218
+ resolve(0);
219
+ return;
220
+ }
221
+
222
+ // 确保列表存在
223
+ if (!this.data[key]) {
224
+ this.data[key] = { value: [], expire: 0 };
225
+ // 添加到列表
226
+ if (!this.list.includes(key)) {
227
+ this.list.push(key);
228
+ }
229
+ } else if (!Array.isArray(this.data[key].value)) {
230
+ this.data[key].value = [];
231
+ }
232
+
233
+ // 将值添加到列表头部
234
+ this.data[key].value.unshift(...values);
235
+
236
+ // 触发后置事件
237
+ this.emit('lpush_after', {
238
+ key,
239
+ value: { values },
240
+ result: this.data[key].value.length
241
+ });
242
+ resolve(this.data[key].value.length);
243
+ } catch (error) {
244
+ // 触发错误事件
245
+ this.emit('lpush_error', {
246
+ key,
247
+ value: { values },
248
+ error
249
+ });
250
+ $.log.error('[cachebase] lpush操作失败:', error);
251
+ resolve(0);
252
+ }
253
+ });
254
+ }
255
+
256
+ // 集合添加方法
257
+ async sadd(key, ...members) {
258
+ return new Promise((resolve) => {
259
+ try {
260
+ // 触发前置事件,将members作为value的一部分
261
+ const beforeEventData = {
262
+ key,
263
+ value: { members },
264
+ cancel: false
265
+ };
266
+ this.emit('sadd_before', beforeEventData);
267
+
268
+ // 如果事件处理器设置了cancel为true,则取消操作
269
+ if (beforeEventData.cancel) {
270
+ resolve(0);
271
+ return;
272
+ }
273
+
274
+ // 确保集合存在
275
+ if (!this.data[key]) {
276
+ this.data[key] = { value: new Set(), expire: 0 };
277
+ // 添加到列表
278
+ if (!this.list.includes(key)) {
279
+ this.list.push(key);
280
+ }
281
+ } else if (!(this.data[key].value instanceof Set)) {
282
+ this.data[key].value = new Set();
283
+ }
284
+
285
+ // 记录添加前的大小
286
+ const beforeSize = this.data[key].value.size;
287
+
288
+ // 添加成员
289
+ members.forEach(member => {
290
+ this.data[key].value.add(member);
291
+ });
292
+
293
+ // 计算新增的成员数
294
+ const addedCount = this.data[key].value.size - beforeSize;
295
+
296
+ // 触发后置事件
297
+ this.emit('sadd_after', {
298
+ key,
299
+ value: { members },
300
+ result: addedCount
301
+ });
302
+ resolve(addedCount);
303
+ } catch (error) {
304
+ // 触发错误事件
305
+ this.emit('sadd_error', {
306
+ key,
307
+ value: { members },
308
+ error
309
+ });
310
+ $.log.error('[cachebase] sadd操作失败:', error);
311
+ resolve(0);
312
+ }
313
+ });
314
+ }
315
+
316
+ // 有序集合添加方法
317
+ async zadd(key, ...args) {
318
+ return new Promise((resolve) => {
319
+ try {
320
+ // 触发前置事件,将args作为value的一部分
321
+ const beforeEventData = {
322
+ key,
323
+ value: { args },
324
+ cancel: false
325
+ };
326
+ this.emit('zadd_before', beforeEventData);
327
+
328
+ // 如果事件处理器设置了cancel为true,则取消操作
329
+ if (beforeEventData.cancel) {
330
+ resolve(0);
331
+ return;
332
+ }
333
+
334
+ // 确保有序集合存在
335
+ if (!this.data[key]) {
336
+ this.data[key] = { value: { members: {}, sorted: [] }, expire: 0 };
337
+ // 添加到列表
338
+ if (!this.list.includes(key)) {
339
+ this.list.push(key);
340
+ }
341
+ } else if (!this.data[key].value || !this.data[key].value.members) {
342
+ this.data[key].value = { members: {}, sorted: [] };
343
+ }
344
+
345
+ let addedCount = 0;
346
+
347
+ // 处理参数并添加成员
348
+ for (let i = 0; i < args.length; i += 2) {
349
+ const score = parseFloat(args[i]);
350
+ const member = args[i + 1];
351
+
352
+ // 如果成员不存在,则计数增加
353
+ if (!this.data[key].value.members.hasOwnProperty(member)) {
354
+ addedCount++;
355
+ }
356
+
357
+ // 设置成员分数
358
+ this.data[key].value.members[member] = score;
359
+ }
360
+
361
+ // 更新排序
362
+ this.data[key].value.sorted = Object.entries(this.data[key].value.members)
363
+ .sort((a, b) => a[1] - b[1])
364
+ .map(entry => entry[0]);
365
+
366
+ // 触发后置事件
367
+ this.emit('zadd_after', {
368
+ key,
369
+ value: { args },
370
+ result: addedCount
371
+ });
372
+ resolve(addedCount);
373
+ } catch (error) {
374
+ // 触发错误事件
375
+ this.emit('zadd_error', {
376
+ key,
377
+ value: { args },
378
+ error
379
+ });
380
+ $.log.error('[cachebase] zadd操作失败:', error);
381
+ resolve(0);
382
+ }
383
+ });
384
+ }
385
+
386
+ // 修复的mset方法
387
+ async mset(...args) {
388
+ return new Promise((resolve) => {
389
+ try {
390
+ // 触发前置事件,将args作为value的一部分
391
+ const beforeEventData = {
392
+ value: { args },
393
+ cancel: false
394
+ };
395
+ this.emit('mset_before', beforeEventData);
396
+
397
+ // 如果事件处理器设置了cancel为true,则取消操作
398
+ if (beforeEventData.cancel) {
399
+ resolve('');
400
+ return;
401
+ }
402
+
403
+ // 参数校验
404
+ if (args.length % 2 !== 0) {
405
+ $.log.error('[cachebase] [cachebase] mset参数数量不正确');
406
+ resolve('ERR');
407
+ return;
408
+ }
409
+
410
+ // 执行实际操作
411
+ for (let i = 0; i < args.length; i += 2) {
412
+ const key = args[i];
413
+ const value = args[i + 1];
414
+ this.data[key] = { value, expire: 0 };
415
+ // 添加到列表
416
+ if (!this.list.includes(key)) {
417
+ this.list.push(key);
418
+ }
419
+ }
420
+
421
+ // 触发后置事件
422
+ this.emit('mset_after', {
423
+ value: { args },
424
+ result: 'OK'
425
+ });
426
+ resolve('OK');
427
+ } catch (error) {
428
+ // 触发错误事件
429
+ this.emit('mset_error', {
430
+ value: { args },
431
+ error
432
+ });
433
+ $.log.error('[cachebase] mset操作失败:', error);
434
+ resolve('ERR');
435
+ }
436
+ });
437
+ }
438
+
439
+ // 浮点数加法方法
440
+ async addFloat(key, value) {
441
+ return new Promise((resolve) => {
442
+ try {
443
+ // 触发前置事件,将value作为浮点数
444
+ const beforeEventData = {
445
+ key,
446
+ value: parseFloat(value),
447
+ cancel: false
448
+ };
449
+ this.emit('addFloat_before', beforeEventData);
450
+
451
+ // 如果事件处理器设置了cancel为true,则取消操作
452
+ if (beforeEventData.cancel) {
453
+ resolve(0);
454
+ return;
455
+ }
456
+
457
+ // 获取当前值或默认为0
458
+ let currentValue = 0;
459
+ if (this.data[key] && typeof this.data[key].value === 'number') {
460
+ currentValue = this.data[key].value;
461
+ }
462
+
463
+ // 执行加法
464
+ const result = currentValue + parseFloat(value);
465
+
466
+ // 保存结果
467
+ this.data[key] = { value: result, expire: 0 };
468
+ // 添加到列表
469
+ if (!this.list.includes(key)) {
470
+ this.list.push(key);
471
+ }
472
+
473
+ // 触发后置事件
474
+ this.emit('addFloat_after', {
475
+ key,
476
+ value: parseFloat(value),
477
+ result
478
+ });
479
+ resolve(result);
480
+ } catch (error) {
481
+ // 触发错误事件
482
+ this.emit('addFloat_error', {
483
+ key,
484
+ value: parseFloat(value),
485
+ error
486
+ });
487
+ $.log.error('[cachebase] addFloat操作失败:', error);
488
+ resolve(0);
489
+ }
490
+ });
491
+ }
492
+
493
+ // 字符串添加方法
494
+ async addStr(key, value) {
495
+ return new Promise((resolve) => {
496
+ try {
497
+ // 触发前置事件,将value作为字符串
498
+ const beforeEventData = {
499
+ key,
500
+ value: String(value),
501
+ cancel: false
502
+ };
503
+ this.emit('addStr_before', beforeEventData);
504
+
505
+ // 如果事件处理器设置了cancel为true,则取消操作
506
+ if (beforeEventData.cancel) {
507
+ resolve(0);
508
+ return;
509
+ }
510
+
511
+ // 获取当前值或默认为空字符串
512
+ let currentValue = '';
513
+ if (this.data[key] && typeof this.data[key].value === 'string') {
514
+ currentValue = this.data[key].value;
515
+ }
516
+
517
+ // 执行字符串拼接
518
+ const result = currentValue + value;
519
+
520
+ // 保存结果
521
+ this.data[key] = { value: result, expire: 0 };
522
+ // 添加到列表
523
+ if (!this.list.includes(key)) {
524
+ this.list.push(key);
525
+ }
526
+
527
+ // 触发后置事件
528
+ this.emit('addStr_after', {
529
+ key,
530
+ value: String(value),
531
+ result
532
+ });
533
+ resolve(result);
534
+ } catch (error) {
535
+ // 触发错误事件
536
+ this.emit('addStr_error', {
537
+ key,
538
+ value: String(value),
539
+ error
540
+ });
541
+ $.log.error('[cachebase] addStr操作失败:', error);
542
+ resolve(0);
543
+ }
544
+ });
545
+ }
546
+
547
+ // 整数加法方法
548
+ async add(key, value) {
549
+ return new Promise((resolve) => {
550
+ try {
551
+ // 触发前置事件,将value作为整数
552
+ const beforeEventData = {
553
+ key,
554
+ value: parseInt(value, 10),
555
+ cancel: false
556
+ };
557
+ this.emit('add_before', beforeEventData);
558
+
559
+ // 如果事件处理器设置了cancel为true,则取消操作
560
+ if (beforeEventData.cancel) {
561
+ resolve(0);
562
+ return;
563
+ }
564
+
565
+ // 获取当前值或默认为0
566
+ let currentValue = 0;
567
+ if (this.data[key] && typeof this.data[key].value === 'number') {
568
+ currentValue = this.data[key].value;
569
+ }
570
+
571
+ // 执行整数加法
572
+ const result = currentValue + parseInt(value, 10);
573
+
574
+ // 保存结果
575
+ this.data[key] = { value: result, expire: 0 };
576
+ // 添加到列表
577
+ if (!this.list.includes(key)) {
578
+ this.list.push(key);
579
+ }
580
+
581
+ // 触发后置事件
582
+ this.emit('add_after', {
583
+ key,
584
+ value: parseInt(value, 10),
585
+ result
586
+ });
587
+ resolve(result);
588
+ } catch (error) {
589
+ // 触发错误事件
590
+ this.emit('add_error', {
591
+ key,
592
+ value: parseInt(value, 10),
593
+ error
594
+ });
595
+ $.log.error('[cachebase] add操作失败:', error);
596
+ resolve(0);
597
+ }
598
+ });
599
+ }
600
+
601
+ // 列表设置方法 - 修改为兼容test.js
602
+ async list_set(key, value) {
603
+ return new Promise((resolve) => {
604
+ try {
605
+ // 触发前置事件
606
+ const beforeEventData = {
607
+ key,
608
+ value,
609
+ cancel: false
610
+ };
611
+ this.emit('list_set_before', beforeEventData);
612
+
613
+ // 如果事件处理器设置了cancel为true,则取消操作
614
+ if (beforeEventData.cancel) {
615
+ resolve(0);
616
+ return;
617
+ }
618
+
619
+ // 确保值是数组
620
+ if (!Array.isArray(value)) {
621
+ this.emit('list_set_error', {
622
+ key,
623
+ value,
624
+ error: new Error('值必须是数组')
625
+ });
626
+ resolve(0);
627
+ return;
628
+ }
629
+
630
+ // 设置数组
631
+ this.data[key] = { value, expire: 0 };
632
+ // 添加到列表
633
+ if (!this.list.includes(key)) {
634
+ this.list.push(key);
635
+ }
636
+
637
+ // 触发后置事件
638
+ this.emit('list_set_after', {
639
+ key,
640
+ value,
641
+ result: 1
642
+ });
643
+ resolve(1);
644
+ } catch (error) {
645
+ // 触发错误事件
646
+ this.emit('list_set_error', {
647
+ key,
648
+ value,
649
+ error
650
+ });
651
+ $.log.error('[cachebase] list_set操作失败:', error);
652
+ resolve(0);
653
+ }
654
+ });
655
+ }
656
+
657
+ // 列表添加元素方法
658
+ async list_add(key, value) {
659
+ return new Promise((resolve) => {
660
+ try {
661
+ // 触发前置事件
662
+ const beforeEventData = {
663
+ key,
664
+ value,
665
+ cancel: false
666
+ };
667
+ this.emit('list_add_before', beforeEventData);
668
+
669
+ // 如果事件处理器设置了cancel为true,则取消操作
670
+ if (beforeEventData.cancel) {
671
+ resolve(0);
672
+ return;
673
+ }
674
+
675
+ // 确保列表存在
676
+ if (!this.data[key]) {
677
+ this.data[key] = { value: [], expire: 0 };
678
+ // 添加到列表
679
+ if (!this.list.includes(key)) {
680
+ this.list.push(key);
681
+ }
682
+ } else if (!Array.isArray(this.data[key].value)) {
683
+ this.data[key].value = [];
684
+ }
685
+
686
+ // 添加元素到列表末尾
687
+ this.data[key].value.push(value);
688
+
689
+ // 触发后置事件
690
+ this.emit('list_add_after', {
691
+ key,
692
+ value,
693
+ result: this.data[key].value.length
694
+ });
695
+ resolve(this.data[key].value.length);
696
+ } catch (error) {
697
+ // 触发错误事件
698
+ this.emit('list_add_error', {
699
+ key,
700
+ value,
701
+ error
702
+ });
703
+ $.log.error('[cachebase] list_add操作失败:', error);
704
+ resolve(0);
705
+ }
706
+ });
707
+ }
708
+
709
+ // 列表清空方法
710
+ async list_clear(key, newValue) {
711
+ return new Promise((resolve) => {
712
+ try {
713
+ // 触发前置事件
714
+ const beforeEventData = {
715
+ key,
716
+ cancel: false
717
+ };
718
+ this.emit('list_clear_before', beforeEventData);
719
+
720
+ // 如果事件处理器设置了cancel为true,则取消操作
721
+ if (beforeEventData.cancel) {
722
+ resolve(0);
723
+ return;
724
+ }
725
+
726
+ // 检查键是否存在且值为数组
727
+ if (this.data[key] && Array.isArray(this.data[key].value)) {
728
+ // 如果提供了新值且是数组,则替换
729
+ if (newValue && Array.isArray(newValue)) {
730
+ this.data[key].value = newValue;
731
+ } else {
732
+ // 否则清空数组
733
+ this.data[key].value = [];
734
+ }
735
+
736
+ // 触发后置事件
737
+ this.emit('list_clear_after', {
738
+ key,
739
+ result: 1
740
+ });
741
+ resolve(1);
742
+ } else {
743
+ // 键不存在或值不是数组,如果提供了新值,则设置
744
+ if (newValue && Array.isArray(newValue)) {
745
+ this.data[key] = { value: newValue, expire: 0 };
746
+ // 添加到列表
747
+ if (!this.list.includes(key)) {
748
+ this.list.push(key);
749
+ }
750
+ this.emit('list_clear_after', {
751
+ key,
752
+ result: 1
753
+ });
754
+ resolve(1);
755
+ } else {
756
+ this.emit('list_clear_after', {
757
+ key,
758
+ result: 0
759
+ });
760
+ resolve(0);
761
+ }
762
+ }
763
+ } catch (error) {
764
+ // 触发错误事件
765
+ this.emit('list_clear_error', {
766
+ key,
767
+ error
768
+ });
769
+ $.log.error('[cachebase] list_clear操作失败:', error);
770
+ resolve(0);
771
+ }
772
+ });
773
+ }
774
+
775
+ // 仅当键不存在时设置值方法
776
+ async setnx(key, value) {
777
+ return new Promise((resolve) => {
778
+ try {
779
+ // 触发前置事件
780
+ const beforeEventData = {
781
+ key,
782
+ value,
783
+ cancel: false
784
+ };
785
+ this.emit('setnx_before', beforeEventData);
786
+
787
+ // 如果事件处理器设置了cancel为true,则取消操作
788
+ if (beforeEventData.cancel) {
789
+ resolve(0);
790
+ return;
791
+ }
792
+
793
+ // 检查键是否不存在
794
+ if (!this.data.hasOwnProperty(key)) {
795
+ // 设置值
796
+ this.data[key] = { value, expire: 0 };
797
+ // 添加到列表
798
+ if (!this.list.includes(key)) {
799
+ this.list.push(key);
800
+ }
801
+
802
+ // 触发后置事件
803
+ this.emit('setnx_after', {
804
+ key,
805
+ value,
806
+ result: 1
807
+ });
808
+ resolve(1);
809
+ } else {
810
+ // 键已存在
811
+ this.emit('setnx_after', {
812
+ key,
813
+ value,
814
+ result: 0
815
+ });
816
+ resolve(0);
817
+ }
818
+ } catch (error) {
819
+ // 触发错误事件
820
+ this.emit('setnx_error', {
821
+ key,
822
+ value,
823
+ error
824
+ });
825
+ $.log.error('[cachebase] setnx操作失败:', error);
826
+ resolve(0);
827
+ }
828
+ });
829
+ }
830
+
831
+ // 设置带过期时间的键值对方法
832
+ async setex(key, seconds, value) {
833
+ return new Promise((resolve) => {
834
+ try {
835
+ // 触发前置事件,使用ttl替代seconds
836
+ const beforeEventData = {
837
+ key,
838
+ value,
839
+ ttl: parseInt(seconds, 10),
840
+ cancel: false
841
+ };
842
+ this.emit('setex_before', beforeEventData);
843
+
844
+ // 如果事件处理器设置了cancel为true,则取消操作
845
+ if (beforeEventData.cancel) {
846
+ resolve(0);
847
+ return;
848
+ }
849
+
850
+ // 计算过期时间
851
+ const expireTime = Date.now() + (parseInt(seconds, 10) * 1000);
852
+
853
+ // 设置值和过期时间
854
+ this.data[key] = { value, expire: expireTime };
855
+ // 添加到列表
856
+ if (!this.list.includes(key)) {
857
+ this.list.push(key);
858
+ }
859
+
860
+ // 触发后置事件,使用ttl替代seconds
861
+ this.emit('setex_after', {
862
+ key,
863
+ value,
864
+ ttl: parseInt(seconds, 10),
865
+ result: "OK"
866
+ });
867
+ resolve("OK");
868
+ } catch (error) {
869
+ // 触发错误事件,使用ttl替代seconds
870
+ this.emit('setex_error', {
871
+ key,
872
+ value,
873
+ ttl: parseInt(seconds, 10),
874
+ error
875
+ });
876
+ $.log.error('[cachebase] setex操作失败:', error);
877
+ resolve(0);
878
+ }
879
+ });
880
+ }
881
+
882
+ // 修复的setrange方法
883
+ async setrange(key, index, value) {
884
+ return new Promise((resolve) => {
885
+ try {
886
+ // 触发前置事件,将index和value作为value的一部分
887
+ const beforeEventData = {
888
+ key,
889
+ value: { index, value },
890
+ cancel: false
891
+ };
892
+ this.emit('setrange_before', beforeEventData);
893
+
894
+ // 如果事件处理器设置了cancel为true,则取消操作
895
+ if (beforeEventData.cancel) {
896
+ resolve('ERR');
897
+ return;
898
+ }
899
+
900
+ const obj = this.data[key];
901
+ if (obj) {
902
+ // 确保值为字符串类型
903
+ let val = String(obj.value || '');
904
+ index = Math.max(0, parseInt(index) || 0);
905
+
906
+ // 处理index超出字符串长度的情况
907
+ if (index > val.length) {
908
+ // 填充空白字符
909
+ val = val.padEnd(index, '');
910
+ }
911
+
912
+ const start = val.substring(0, index);
913
+ const end = val.substring(index, val.length);
914
+ obj.value = start + value + end;
915
+
916
+ // 触发后置事件
917
+ this.emit('setrange_after', {
918
+ key,
919
+ value: { index, value },
920
+ result: obj.value.length
921
+ });
922
+ resolve(obj.value.length);
923
+ } else {
924
+ resolve('ERR');
925
+ }
926
+ } catch (error) {
927
+ // 触发错误事件
928
+ this.emit('setrange_error', {
929
+ key,
930
+ value: { index, value },
931
+ error
932
+ });
933
+ $.log.error('[cachebase] setrange操作失败:', error);
934
+ resolve('ERR');
935
+ }
936
+ });
937
+ }
938
+
939
+ // 新增:列表获取方法,包含事件触发
940
+ async list_get(key, start = 0, end = -1) {
941
+ return new Promise((resolve) => {
942
+ try {
943
+ // 触发前置事件
944
+ const beforeEventData = {
945
+ key,
946
+ value: { start, end },
947
+ cancel: false
948
+ };
949
+ this.emit('list_get_before', beforeEventData);
950
+
951
+ // 如果事件处理器设置了cancel为true,则取消操作
952
+ if (beforeEventData.cancel) {
953
+ resolve([]);
954
+ return;
955
+ }
956
+
957
+ // 执行实际操作
958
+ const obj = this.data[key];
959
+ let result = [];
960
+ if (obj && Array.isArray(obj.value)) {
961
+ if (end === -1) {
962
+ result = obj.value.slice(start);
963
+ } else {
964
+ result = obj.value.slice(start, end + 1);
965
+ }
966
+ }
967
+
968
+ // 触发后置事件
969
+ this.emit('list_get_after', {
970
+ key,
971
+ value: { start, end },
972
+ result
973
+ });
974
+ resolve(result);
975
+ } catch (error) {
976
+ // 触发错误事件
977
+ this.emit('list_get_error', {
978
+ key,
979
+ value: { start, end },
980
+ error
981
+ });
982
+ $.log.error('[cachebase] list_get操作失败:', error);
983
+ resolve([]);
984
+ }
985
+ });
986
+ }
987
+
988
+ // 新增:字符串范围获取方法,包含事件触发
989
+ async getrange(key, start, end) {
990
+ return new Promise((resolve) => {
991
+ try {
992
+ // 触发前置事件
993
+ const beforeEventData = {
994
+ key,
995
+ value: { start, end },
996
+ cancel: false
997
+ };
998
+ this.emit('getrange_before', beforeEventData);
999
+
1000
+ // 如果事件处理器设置了cancel为true,则取消操作
1001
+ if (beforeEventData.cancel) {
1002
+ resolve('');
1003
+ return;
1004
+ }
1005
+
1006
+ // 执行实际操作
1007
+ const obj = this.data[key];
1008
+ let result = '';
1009
+ if (obj && typeof obj.value === 'string') {
1010
+ // 处理负数索引
1011
+ if (start < 0) start = Math.max(0, obj.value.length + start);
1012
+ if (end < 0) end = Math.max(0, obj.value.length + end);
1013
+
1014
+ // 确保索引在有效范围内
1015
+ start = Math.max(0, start);
1016
+ end = Math.min(obj.value.length - 1, end);
1017
+
1018
+ if (start <= end) {
1019
+ result = obj.value.substring(start, end + 1);
1020
+ }
1021
+ }
1022
+
1023
+ // 触发后置事件
1024
+ this.emit('getrange_after', {
1025
+ key,
1026
+ value: { start, end },
1027
+ result
1028
+ });
1029
+ resolve(result);
1030
+ } catch (error) {
1031
+ // 触发错误事件
1032
+ this.emit('getrange_error', {
1033
+ key,
1034
+ value: { start, end },
1035
+ error
1036
+ });
1037
+ $.log.error('[cachebase] getrange操作失败:', error);
1038
+ resolve('');
1039
+ }
1040
+ });
1041
+ }
1042
+
1043
+ // 新增:列表包含检查方法,包含事件触发
1044
+ async list_has(key, value) {
1045
+ return new Promise((resolve) => {
1046
+ try {
1047
+ // 触发前置事件
1048
+ const beforeEventData = {
1049
+ key,
1050
+ value,
1051
+ cancel: false
1052
+ };
1053
+ this.emit('list_has_before', beforeEventData);
1054
+
1055
+ // 如果事件处理器设置了cancel为true,则取消操作
1056
+ if (beforeEventData.cancel) {
1057
+ resolve(0);
1058
+ return;
1059
+ }
1060
+
1061
+ // 执行实际操作
1062
+ const obj = this.data[key];
1063
+ let result = 0;
1064
+ if (obj && Array.isArray(obj.value)) {
1065
+ result = obj.value.includes(value) ? 1 : 0;
1066
+ }
1067
+
1068
+ // 触发后置事件
1069
+ this.emit('list_has_after', {
1070
+ key,
1071
+ value,
1072
+ result
1073
+ });
1074
+ resolve(result);
1075
+ } catch (error) {
1076
+ // 触发错误事件
1077
+ this.emit('list_has_error', {
1078
+ key,
1079
+ value,
1080
+ error
1081
+ });
1082
+ $.log.error('[cachebase] list_has操作失败:', error);
1083
+ resolve(0);
1084
+ }
1085
+ });
1086
+ }
1087
+
1088
+ // 检查键是否存在方法,包含事件触发
1089
+ async exists(key) {
1090
+ return new Promise((resolve) => {
1091
+ try {
1092
+ // 触发前置事件
1093
+ const beforeEventData = {
1094
+ key,
1095
+ cancel: false
1096
+ };
1097
+ this.emit('exists_before', beforeEventData);
1098
+
1099
+ // 如果事件处理器设置了cancel为true,则取消操作
1100
+ if (beforeEventData.cancel) {
1101
+ resolve(0);
1102
+ return;
1103
+ }
1104
+
1105
+ // 执行实际操作
1106
+ const result = key in this.data ? 1 : 0;
1107
+
1108
+ // 触发后置事件
1109
+ this.emit('exists_after', {
1110
+ key,
1111
+ result
1112
+ });
1113
+ resolve(result);
1114
+ } catch (error) {
1115
+ // 触发错误事件
1116
+ this.emit('exists_error', {
1117
+ key,
1118
+ error
1119
+ });
1120
+ $.log.error('[cachebase] exists操作失败:', error);
1121
+ resolve(0);
1122
+ }
1123
+ });
1124
+ }
1125
+
1126
+ // 检查键是否存在的别名方法,包含事件触发
1127
+ async has(key) {
1128
+ return new Promise((resolve) => {
1129
+ try {
1130
+ // 触发前置事件
1131
+ const beforeEventData = {
1132
+ key,
1133
+ cancel: false
1134
+ };
1135
+ this.emit('has_before', beforeEventData);
1136
+
1137
+ // 如果事件处理器设置了cancel为true,则取消操作
1138
+ if (beforeEventData.cancel) {
1139
+ resolve(0);
1140
+ return;
1141
+ }
1142
+
1143
+ // 执行实际操作
1144
+ const result = key in this.data ? 1 : 0;
1145
+
1146
+ // 触发后置事件
1147
+ this.emit('has_after', {
1148
+ key,
1149
+ result
1150
+ });
1151
+ resolve(result);
1152
+ } catch (error) {
1153
+ // 触发错误事件
1154
+ this.emit('has_error', {
1155
+ key,
1156
+ error
1157
+ });
1158
+ $.log.error('[cachebase] has操作失败:', error);
1159
+ resolve(0);
1160
+ }
1161
+ });
1162
+ }
1163
+
1164
+ // 查询/设置过期时间方法,包含事件触发
1165
+ async ttl(key, maxAge) {
1166
+ return new Promise((resolve) => {
1167
+ try {
1168
+ // 触发前置事件
1169
+ const beforeEventData = {
1170
+ key,
1171
+ value: maxAge !== undefined ? { ttl: maxAge } : undefined,
1172
+ cancel: false
1173
+ };
1174
+ this.emit('ttl_before', beforeEventData);
1175
+
1176
+ // 如果事件处理器设置了cancel为true,则取消操作
1177
+ if (beforeEventData.cancel) {
1178
+ resolve(maxAge !== undefined ? 0 : -2);
1179
+ return;
1180
+ }
1181
+
1182
+ // 执行实际操作
1183
+ const obj = this.data[key];
1184
+ let result;
1185
+
1186
+ if (!obj) {
1187
+ result = -2; // 键不存在
1188
+ } else if (maxAge !== undefined) {
1189
+ // 设置过期时间
1190
+ if (maxAge === -1) {
1191
+ obj.expire = 0; // 永不过期
1192
+ } else {
1193
+ obj.expire = Date.now() + (parseInt(maxAge, 10) * 1000);
1194
+ }
1195
+ result = 1;
1196
+ } else {
1197
+ // 查询过期时间
1198
+ if (obj.expire === 0) {
1199
+ result = -1; // 永不过期
1200
+ } else {
1201
+ const remaining = Math.floor((obj.expire - Date.now()) / 1000);
1202
+ result = remaining > 0 ? remaining : -2; // -2表示已过期
1203
+ }
1204
+ }
1205
+
1206
+ // 触发后置事件
1207
+ this.emit('ttl_after', {
1208
+ key,
1209
+ value: maxAge !== undefined ? { ttl: maxAge } : undefined,
1210
+ result
1211
+ });
1212
+ resolve(result);
1213
+ } catch (error) {
1214
+ // 触发错误事件
1215
+ this.emit('ttl_error', {
1216
+ key,
1217
+ value: maxAge !== undefined ? { ttl: maxAge } : undefined,
1218
+ error
1219
+ });
1220
+ $.log.error('[cachebase] ttl操作失败:', error);
1221
+ resolve(-2);
1222
+ }
1223
+ });
1224
+ }
1225
+
1226
+ // 获取所有匹配键方法,包含事件触发
1227
+ async keys(pattern) {
1228
+ return new Promise((resolve) => {
1229
+ try {
1230
+ // 触发前置事件
1231
+ const beforeEventData = {
1232
+ value: { pattern },
1233
+ cancel: false
1234
+ };
1235
+ this.emit('keys_before', beforeEventData);
1236
+
1237
+ // 如果事件处理器设置了cancel为true,则取消操作
1238
+ if (beforeEventData.cancel) {
1239
+ resolve([]);
1240
+ return;
1241
+ }
1242
+
1243
+ // 执行实际操作
1244
+ let result;
1245
+ if (!pattern || pattern === '*') {
1246
+ result = [...this.list];
1247
+ } else {
1248
+ // 转换模式为正则表达式
1249
+ const regexPattern = pattern
1250
+ .replace(/\./g, '\\.')
1251
+ .replace(/\*/g, '.*')
1252
+ .replace(/\?/g, '.');
1253
+ const regex = new RegExp(`^${regexPattern}$`);
1254
+
1255
+ // 过滤匹配的键
1256
+ result = this.list.filter(key => regex.test(key));
1257
+ }
1258
+
1259
+ // 触发后置事件
1260
+ this.emit('keys_after', {
1261
+ value: { pattern },
1262
+ result
1263
+ });
1264
+ resolve(result);
1265
+ } catch (error) {
1266
+ // 触发错误事件
1267
+ this.emit('keys_error', {
1268
+ value: { pattern },
1269
+ error
1270
+ });
1271
+ $.log.error('[cachebase] keys操作失败:', error);
1272
+ resolve([]);
1273
+ }
1274
+ });
1275
+ }
1276
+
1277
+ // 清空缓存方法,包含事件触发
1278
+ async clear(pattern) {
1279
+ return new Promise((resolve) => {
1280
+ try {
1281
+ // 触发前置事件
1282
+ const beforeEventData = {
1283
+ value: { pattern },
1284
+ cancel: false
1285
+ };
1286
+ this.emit('clear_before', beforeEventData);
1287
+
1288
+ // 如果事件处理器设置了cancel为true,则取消操作
1289
+ if (beforeEventData.cancel) {
1290
+ resolve(0);
1291
+ return;
1292
+ }
1293
+
1294
+ // 执行实际操作
1295
+ let keysToDelete;
1296
+
1297
+ if (!pattern || pattern === '*') {
1298
+ keysToDelete = [...this.list];
1299
+ } else {
1300
+ // 转换模式为正则表达式
1301
+ const regexPattern = pattern
1302
+ .replace(/\./g, '\\.')
1303
+ .replace(/\*/g, '.*')
1304
+ .replace(/\?/g, '.');
1305
+ const regex = new RegExp(`^${regexPattern}$`);
1306
+
1307
+ keysToDelete = this.list.filter(key => regex.test(key));
1308
+ }
1309
+
1310
+ // 删除匹配的键
1311
+ keysToDelete.forEach(key => {
1312
+ delete this.data[key];
1313
+ const index = this.list.indexOf(key);
1314
+ if (index > -1) {
1315
+ this.list.splice(index, 1);
1316
+ }
1317
+ });
1318
+
1319
+ // 触发后置事件
1320
+ this.emit('clear_after', {
1321
+ value: { pattern },
1322
+ result: keysToDelete.length
1323
+ });
1324
+ resolve(keysToDelete.length);
1325
+ } catch (error) {
1326
+ // 触发错误事件
1327
+ this.emit('clear_error', {
1328
+ value: { pattern },
1329
+ error
1330
+ });
1331
+ $.log.error('[cachebase] clear操作失败:', error);
1332
+ resolve(0);
1333
+ }
1334
+ });
1335
+ }
1336
+
1337
+ // 哈希表获取字段值方法,包含事件触发
1338
+ async hget(key, field) {
1339
+ return new Promise((resolve) => {
1340
+ try {
1341
+ // 触发前置事件
1342
+ const beforeEventData = {
1343
+ key,
1344
+ value: { field },
1345
+ cancel: false
1346
+ };
1347
+ this.emit('hget_before', beforeEventData);
1348
+
1349
+ // 如果事件处理器设置了cancel为true,则取消操作
1350
+ if (beforeEventData.cancel) {
1351
+ resolve(null);
1352
+ return;
1353
+ }
1354
+
1355
+ // 执行实际操作
1356
+ const obj = this.data[key];
1357
+ let result = null;
1358
+ if (obj && typeof obj.value === 'object' && field in obj.value) {
1359
+ result = obj.value[field];
1360
+ }
1361
+
1362
+ // 触发后置事件
1363
+ this.emit('hget_after', {
1364
+ key,
1365
+ value: { field },
1366
+ result
1367
+ });
1368
+ resolve(result);
1369
+ } catch (error) {
1370
+ // 触发错误事件
1371
+ this.emit('hget_error', {
1372
+ key,
1373
+ value: { field },
1374
+ error
1375
+ });
1376
+ $.log.error('[cachebase] hget操作失败:', error);
1377
+ resolve(null);
1378
+ }
1379
+ });
1380
+ }
1381
+
1382
+ // 哈希表获取所有字段和值方法,包含事件触发
1383
+ async hgetall(key) {
1384
+ return new Promise((resolve) => {
1385
+ try {
1386
+ // 触发前置事件
1387
+ const beforeEventData = {
1388
+ key,
1389
+ cancel: false
1390
+ };
1391
+ this.emit('hgetall_before', beforeEventData);
1392
+
1393
+ // 如果事件处理器设置了cancel为true,则取消操作
1394
+ if (beforeEventData.cancel) {
1395
+ resolve({});
1396
+ return;
1397
+ }
1398
+
1399
+ // 执行实际操作
1400
+ const obj = this.data[key];
1401
+ let result = {};
1402
+ if (obj && typeof obj.value === 'object') {
1403
+ result = {...obj.value};
1404
+ }
1405
+
1406
+ // 触发后置事件
1407
+ this.emit('hgetall_after', {
1408
+ key,
1409
+ result
1410
+ });
1411
+ resolve(result);
1412
+ } catch (error) {
1413
+ // 触发错误事件
1414
+ this.emit('hgetall_error', {
1415
+ key,
1416
+ error
1417
+ });
1418
+ $.log.error('[cachebase] hgetall操作失败:', error);
1419
+ resolve({});
1420
+ }
1421
+ });
1422
+ }
1423
+
1424
+ // 哈希表删除字段方法,包含事件触发
1425
+ async hdel(key, field) {
1426
+ return new Promise((resolve) => {
1427
+ try {
1428
+ // 触发前置事件
1429
+ const beforeEventData = {
1430
+ key,
1431
+ value: { field },
1432
+ cancel: false
1433
+ };
1434
+ this.emit('hdel_before', beforeEventData);
1435
+
1436
+ // 如果事件处理器设置了cancel为true,则取消操作
1437
+ if (beforeEventData.cancel) {
1438
+ resolve(0);
1439
+ return;
1440
+ }
1441
+
1442
+ // 执行实际操作
1443
+ let result = 0;
1444
+ const obj = this.data[key];
1445
+ if (obj && typeof obj.value === 'object' && field in obj.value) {
1446
+ delete obj.value[field];
1447
+ // 如果哈希表变空了,删除整个键
1448
+ if (Object.keys(obj.value).length === 0) {
1449
+ delete this.data[key];
1450
+ const index = this.list.indexOf(key);
1451
+ if (index > -1) {
1452
+ this.list.splice(index, 1);
1453
+ }
1454
+ }
1455
+ result = 1;
1456
+ }
1457
+
1458
+ // 触发后置事件
1459
+ this.emit('hdel_after', {
1460
+ key,
1461
+ value: { field },
1462
+ result
1463
+ });
1464
+ resolve(result);
1465
+ } catch (error) {
1466
+ // 触发错误事件
1467
+ this.emit('hdel_error', {
1468
+ key,
1469
+ value: { field },
1470
+ error
1471
+ });
1472
+ $.log.error('[cachebase] hdel操作失败:', error);
1473
+ resolve(0);
1474
+ }
1475
+ });
1476
+ }
1477
+
1478
+ // 哈希表获取所有字段名方法,包含事件触发
1479
+ async hkeys(key) {
1480
+ return new Promise((resolve) => {
1481
+ try {
1482
+ // 触发前置事件
1483
+ const beforeEventData = {
1484
+ key,
1485
+ cancel: false
1486
+ };
1487
+ this.emit('hkeys_before', beforeEventData);
1488
+
1489
+ // 如果事件处理器设置了cancel为true,则取消操作
1490
+ if (beforeEventData.cancel) {
1491
+ resolve([]);
1492
+ return;
1493
+ }
1494
+
1495
+ // 执行实际操作
1496
+ let result = [];
1497
+ const obj = this.data[key];
1498
+ if (obj && typeof obj.value === 'object') {
1499
+ result = Object.keys(obj.value);
1500
+ }
1501
+
1502
+ // 触发后置事件
1503
+ this.emit('hkeys_after', {
1504
+ key,
1505
+ result
1506
+ });
1507
+ resolve(result);
1508
+ } catch (error) {
1509
+ // 触发错误事件
1510
+ this.emit('hkeys_error', {
1511
+ key,
1512
+ error
1513
+ });
1514
+ $.log.error('[cachebase] hkeys操作失败:', error);
1515
+ resolve([]);
1516
+ }
1517
+ });
1518
+ }
1519
+
1520
+ // 哈希表获取所有字段值方法,包含事件触发
1521
+ async hvals(key) {
1522
+ return new Promise((resolve) => {
1523
+ try {
1524
+ // 触发前置事件
1525
+ const beforeEventData = {
1526
+ key,
1527
+ cancel: false
1528
+ };
1529
+ this.emit('hvals_before', beforeEventData);
1530
+
1531
+ // 如果事件处理器设置了cancel为true,则取消操作
1532
+ if (beforeEventData.cancel) {
1533
+ resolve([]);
1534
+ return;
1535
+ }
1536
+
1537
+ // 执行实际操作
1538
+ let result = [];
1539
+ const obj = this.data[key];
1540
+ if (obj && typeof obj.value === 'object') {
1541
+ result = Object.values(obj.value);
1542
+ }
1543
+
1544
+ // 触发后置事件
1545
+ this.emit('hvals_after', {
1546
+ key,
1547
+ result
1548
+ });
1549
+ resolve(result);
1550
+ } catch (error) {
1551
+ // 触发错误事件
1552
+ this.emit('hvals_error', {
1553
+ key,
1554
+ error
1555
+ });
1556
+ $.log.error('[cachebase] hvals操作失败:', error);
1557
+ resolve([]);
1558
+ }
1559
+ });
1560
+ }
1561
+
1562
+ // 列表左侧弹出方法,包含事件触发
1563
+ async lpop(key) {
1564
+ return new Promise((resolve) => {
1565
+ try {
1566
+ // 触发前置事件
1567
+ const beforeEventData = {
1568
+ key,
1569
+ cancel: false
1570
+ };
1571
+ this.emit('lpop_before', beforeEventData);
1572
+
1573
+ // 如果事件处理器设置了cancel为true,则取消操作
1574
+ if (beforeEventData.cancel) {
1575
+ resolve(null);
1576
+ return;
1577
+ }
1578
+
1579
+ // 执行实际操作
1580
+ const obj = this.data[key];
1581
+ let result = null;
1582
+ if (obj && Array.isArray(obj.value) && obj.value.length > 0) {
1583
+ result = obj.value.shift();
1584
+ // 如果列表变空了,删除整个键
1585
+ if (obj.value.length === 0) {
1586
+ delete this.data[key];
1587
+ const index = this.list.indexOf(key);
1588
+ if (index > -1) {
1589
+ this.list.splice(index, 1);
1590
+ }
1591
+ }
1592
+ }
1593
+
1594
+ // 触发后置事件
1595
+ this.emit('lpop_after', {
1596
+ key,
1597
+ result
1598
+ });
1599
+ resolve(result);
1600
+ } catch (error) {
1601
+ // 触发错误事件
1602
+ this.emit('lpop_error', {
1603
+ key,
1604
+ error
1605
+ });
1606
+ $.log.error('[cachebase] lpop操作失败:', error);
1607
+ resolve(null);
1608
+ }
1609
+ });
1610
+ }
1611
+
1612
+ // 列表右侧推入元素方法
1613
+ async rpush(key, ...values) {
1614
+ return new Promise((resolve) => {
1615
+ try {
1616
+ // 触发前置事件
1617
+ const beforeEventData = {
1618
+ key,
1619
+ value: { values },
1620
+ cancel: false
1621
+ };
1622
+ this.emit('rpush_before', beforeEventData);
1623
+
1624
+ // 如果事件处理器设置了cancel为true,则取消操作
1625
+ if (beforeEventData.cancel) {
1626
+ resolve(0);
1627
+ return;
1628
+ }
1629
+
1630
+ // 确保列表存在
1631
+ if (!this.data[key]) {
1632
+ this.data[key] = { value: [], expire: 0 };
1633
+ // 添加到列表
1634
+ if (!this.list.includes(key)) {
1635
+ this.list.push(key);
1636
+ }
1637
+ } else if (!Array.isArray(this.data[key].value)) {
1638
+ this.data[key].value = [];
1639
+ }
1640
+
1641
+ // 将值添加到列表尾部
1642
+ this.data[key].value.push(...values);
1643
+
1644
+ // 触发后置事件
1645
+ this.emit('rpush_after', {
1646
+ key,
1647
+ value: { values },
1648
+ result: this.data[key].value.length
1649
+ });
1650
+ resolve(this.data[key].value.length);
1651
+ } catch (error) {
1652
+ // 触发错误事件
1653
+ this.emit('rpush_error', {
1654
+ key,
1655
+ value: { values },
1656
+ error
1657
+ });
1658
+ $.log.error('[cachebase] rpush操作失败:', error);
1659
+ resolve(0);
1660
+ }
1661
+ });
1662
+ }
1663
+
1664
+ // 列表右侧弹出元素方法,包含事件触发
1665
+ async rpop(key) {
1666
+ return new Promise((resolve) => {
1667
+ try {
1668
+ // 触发前置事件
1669
+ const beforeEventData = {
1670
+ key,
1671
+ cancel: false
1672
+ };
1673
+ this.emit('rpop_before', beforeEventData);
1674
+
1675
+ // 如果事件处理器设置了cancel为true,则取消操作
1676
+ if (beforeEventData.cancel) {
1677
+ resolve(null);
1678
+ return;
1679
+ }
1680
+
1681
+ // 执行实际操作
1682
+ const obj = this.data[key];
1683
+ let result = null;
1684
+ if (obj && Array.isArray(obj.value) && obj.value.length > 0) {
1685
+ result = obj.value.pop();
1686
+ // 如果列表变空了,删除整个键
1687
+ if (obj.value.length === 0) {
1688
+ delete this.data[key];
1689
+ const index = this.list.indexOf(key);
1690
+ if (index > -1) {
1691
+ this.list.splice(index, 1);
1692
+ }
1693
+ }
1694
+ }
1695
+
1696
+ // 触发后置事件
1697
+ this.emit('rpop_after', {
1698
+ key,
1699
+ result
1700
+ });
1701
+ resolve(result);
1702
+ } catch (error) {
1703
+ // 触发错误事件
1704
+ this.emit('rpop_error', {
1705
+ key,
1706
+ error
1707
+ });
1708
+ $.log.error('[cachebase] rpop操作失败:', error);
1709
+ resolve(null);
1710
+ }
1711
+ });
1712
+ }
1713
+
1714
+ // 获取列表长度方法,包含事件触发
1715
+ async llen(key) {
1716
+ return new Promise((resolve) => {
1717
+ try {
1718
+ // 触发前置事件
1719
+ const beforeEventData = {
1720
+ key,
1721
+ cancel: false
1722
+ };
1723
+ this.emit('llen_before', beforeEventData);
1724
+
1725
+ // 如果事件处理器设置了cancel为true,则取消操作
1726
+ if (beforeEventData.cancel) {
1727
+ resolve(0);
1728
+ return;
1729
+ }
1730
+
1731
+ // 执行实际操作
1732
+ let result = 0;
1733
+ const obj = this.data[key];
1734
+ if (obj && Array.isArray(obj.value)) {
1735
+ result = obj.value.length;
1736
+ }
1737
+
1738
+ // 触发后置事件
1739
+ this.emit('llen_after', {
1740
+ key,
1741
+ result
1742
+ });
1743
+ resolve(result);
1744
+ } catch (error) {
1745
+ // 触发错误事件
1746
+ this.emit('llen_error', {
1747
+ key,
1748
+ error
1749
+ });
1750
+ $.log.error('[cachebase] llen操作失败:', error);
1751
+ resolve(0);
1752
+ }
1753
+ });
1754
+ }
1755
+
1756
+ // 集合移除元素方法,包含事件触发
1757
+ async srem(key, value) {
1758
+ return new Promise((resolve) => {
1759
+ try {
1760
+ // 触发前置事件
1761
+ const beforeEventData = {
1762
+ key,
1763
+ value,
1764
+ cancel: false
1765
+ };
1766
+ this.emit('srem_before', beforeEventData);
1767
+
1768
+ // 如果事件处理器设置了cancel为true,则取消操作
1769
+ if (beforeEventData.cancel) {
1770
+ resolve(0);
1771
+ return;
1772
+ }
1773
+
1774
+ // 执行实际操作
1775
+ let result = 0;
1776
+ const obj = this.data[key];
1777
+ if (obj && obj.value && obj.value.members) {
1778
+ if (obj.value.members.hasOwnProperty(value)) {
1779
+ delete obj.value.members[value];
1780
+ // 更新有序数组
1781
+ obj.value.sorted = Object.keys(obj.value.members);
1782
+ result = 1;
1783
+ // 如果集合变空了,删除整个键
1784
+ if (Object.keys(obj.value.members).length === 0) {
1785
+ delete this.data[key];
1786
+ const index = this.list.indexOf(key);
1787
+ if (index > -1) {
1788
+ this.list.splice(index, 1);
1789
+ }
1790
+ }
1791
+ }
1792
+ }
1793
+
1794
+ // 触发后置事件
1795
+ this.emit('srem_after', {
1796
+ key,
1797
+ value,
1798
+ result
1799
+ });
1800
+ resolve(result);
1801
+ } catch (error) {
1802
+ // 触发错误事件
1803
+ this.emit('srem_error', {
1804
+ key,
1805
+ value,
1806
+ error
1807
+ });
1808
+ $.log.error('[cachebase] srem操作失败:', error);
1809
+ resolve(0);
1810
+ }
1811
+ });
1812
+ }
1813
+
1814
+ // 获取集合所有成员方法,包含事件触发
1815
+ async smembers(key) {
1816
+ return new Promise((resolve) => {
1817
+ try {
1818
+ // 触发前置事件
1819
+ const beforeEventData = {
1820
+ key,
1821
+ cancel: false
1822
+ };
1823
+ this.emit('smembers_before', beforeEventData);
1824
+
1825
+ // 如果事件处理器设置了cancel为true,则取消操作
1826
+ if (beforeEventData.cancel) {
1827
+ resolve([]);
1828
+ return;
1829
+ }
1830
+
1831
+ // 执行实际操作
1832
+ let result = [];
1833
+ const obj = this.data[key];
1834
+ if (obj && obj.value && obj.value.sorted) {
1835
+ result = [...obj.value.sorted];
1836
+ }
1837
+
1838
+ // 触发后置事件
1839
+ this.emit('smembers_after', {
1840
+ key,
1841
+ result
1842
+ });
1843
+ resolve(result);
1844
+ } catch (error) {
1845
+ // 触发错误事件
1846
+ this.emit('smembers_error', {
1847
+ key,
1848
+ error
1849
+ });
1850
+ $.log.error('[cachebase] smembers操作失败:', error);
1851
+ resolve([]);
1852
+ }
1853
+ });
1854
+ }
1855
+
1856
+ // 检查元素是否在集合中方法,包含事件触发
1857
+ async sismember(key, value) {
1858
+ return new Promise((resolve) => {
1859
+ try {
1860
+ // 触发前置事件
1861
+ const beforeEventData = {
1862
+ key,
1863
+ value,
1864
+ cancel: false
1865
+ };
1866
+ this.emit('sismember_before', beforeEventData);
1867
+
1868
+ // 如果事件处理器设置了cancel为true,则取消操作
1869
+ if (beforeEventData.cancel) {
1870
+ resolve(0);
1871
+ return;
1872
+ }
1873
+
1874
+ // 执行实际操作
1875
+ let result = 0;
1876
+ const obj = this.data[key];
1877
+ if (obj && obj.value && obj.value.members && obj.value.members.hasOwnProperty(value)) {
1878
+ result = 1;
1879
+ }
1880
+
1881
+ // 触发后置事件
1882
+ this.emit('sismember_after', {
1883
+ key,
1884
+ value,
1885
+ result
1886
+ });
1887
+ resolve(result);
1888
+ } catch (error) {
1889
+ // 触发错误事件
1890
+ this.emit('sismember_error', {
1891
+ key,
1892
+ value,
1893
+ error
1894
+ });
1895
+ $.log.error('[cachebase] sismember操作失败:', error);
1896
+ resolve(0);
1897
+ }
1898
+ });
1899
+ }
1900
+
1901
+ // 获取集合大小方法,包含事件触发
1902
+ async scard(key) {
1903
+ return new Promise((resolve) => {
1904
+ try {
1905
+ // 触发前置事件
1906
+ const beforeEventData = {
1907
+ key,
1908
+ cancel: false
1909
+ };
1910
+ this.emit('scard_before', beforeEventData);
1911
+
1912
+ // 如果事件处理器设置了cancel为true,则取消操作
1913
+ if (beforeEventData.cancel) {
1914
+ resolve(0);
1915
+ return;
1916
+ }
1917
+
1918
+ // 执行实际操作
1919
+ let result = 0;
1920
+ const obj = this.data[key];
1921
+ if (obj && obj.value && obj.value.sorted) {
1922
+ result = obj.value.sorted.length;
1923
+ }
1924
+
1925
+ // 触发后置事件
1926
+ this.emit('scard_after', {
1927
+ key,
1928
+ result
1929
+ });
1930
+ resolve(result);
1931
+ } catch (error) {
1932
+ // 触发错误事件
1933
+ this.emit('scard_error', {
1934
+ key,
1935
+ error
1936
+ });
1937
+ $.log.error('[cachebase] scard操作失败:', error);
1938
+ resolve(0);
1939
+ }
1940
+ });
1941
+ }
1942
+
1943
+ // 获取有序集合范围内的成员方法,包含事件触发
1944
+ async zrange(key, start, stop, withScores = false) {
1945
+ return new Promise((resolve) => {
1946
+ try {
1947
+ // 触发前置事件
1948
+ const beforeEventData = {
1949
+ key,
1950
+ value: { start, stop, withScores },
1951
+ cancel: false
1952
+ };
1953
+ this.emit('zrange_before', beforeEventData);
1954
+
1955
+ // 如果事件处理器设置了cancel为true,则取消操作
1956
+ if (beforeEventData.cancel) {
1957
+ resolve([]);
1958
+ return;
1959
+ }
1960
+
1961
+ // 执行实际操作
1962
+ let result = [];
1963
+ const obj = this.data[key];
1964
+ if (obj && obj.value && obj.value.sorted) {
1965
+ const sorted = obj.value.sorted.slice(start, stop + 1);
1966
+ if (withScores) {
1967
+ result = [];
1968
+ for (const member of sorted) {
1969
+ result.push(member);
1970
+ result.push(obj.value.members[member]);
1971
+ }
1972
+ } else {
1973
+ result = sorted;
1974
+ }
1975
+ }
1976
+
1977
+ // 触发后置事件
1978
+ this.emit('zrange_after', {
1979
+ key,
1980
+ value: { start, stop, withScores },
1981
+ result
1982
+ });
1983
+ resolve(result);
1984
+ } catch (error) {
1985
+ // 触发错误事件
1986
+ this.emit('zrange_error', {
1987
+ key,
1988
+ value: { start, stop, withScores },
1989
+ error
1990
+ });
1991
+ $.log.error('[cachebase] zrange操作失败:', error);
1992
+ resolve([]);
1993
+ }
1994
+ });
1995
+ }
1996
+
1997
+ // 从有序集合中移除成员方法,包含事件触发
1998
+ async zrem(key, member) {
1999
+ return new Promise((resolve) => {
2000
+ try {
2001
+ // 触发前置事件
2002
+ const beforeEventData = {
2003
+ key,
2004
+ value: { member },
2005
+ cancel: false
2006
+ };
2007
+ this.emit('zrem_before', beforeEventData);
2008
+
2009
+ // 如果事件处理器设置了cancel为true,则取消操作
2010
+ if (beforeEventData.cancel) {
2011
+ resolve(0);
2012
+ return;
2013
+ }
2014
+
2015
+ // 执行实际操作
2016
+ let result = 0;
2017
+ const obj = this.data[key];
2018
+ if (obj && obj.value && obj.value.members && obj.value.members.hasOwnProperty(member)) {
2019
+ delete obj.value.members[member];
2020
+ // 重新排序
2021
+ obj.value.sorted = Object.entries(obj.value.members)
2022
+ .sort((a, b) => a[1] - b[1])
2023
+ .map(entry => entry[0]);
2024
+ result = 1;
2025
+ // 如果集合变空了,删除整个键
2026
+ if (Object.keys(obj.value.members).length === 0) {
2027
+ delete this.data[key];
2028
+ const index = this.list.indexOf(key);
2029
+ if (index > -1) {
2030
+ this.list.splice(index, 1);
2031
+ }
2032
+ }
2033
+ }
2034
+
2035
+ // 触发后置事件
2036
+ this.emit('zrem_after', {
2037
+ key,
2038
+ value: { member },
2039
+ result
2040
+ });
2041
+ resolve(result);
2042
+ } catch (error) {
2043
+ // 触发错误事件
2044
+ this.emit('zrem_error', {
2045
+ key,
2046
+ value: { member },
2047
+ error
2048
+ });
2049
+ $.log.error('[cachebase] zrem操作失败:', error);
2050
+ resolve(0);
2051
+ }
2052
+ });
2053
+ }
2054
+
2055
+ // 获取有序集合中成员的分数方法,包含事件触发
2056
+ async zscore(key, member) {
2057
+ return new Promise((resolve) => {
2058
+ try {
2059
+ // 触发前置事件
2060
+ const beforeEventData = {
2061
+ key,
2062
+ value: { member },
2063
+ cancel: false
2064
+ };
2065
+ this.emit('zscore_before', beforeEventData);
2066
+
2067
+ // 如果事件处理器设置了cancel为true,则取消操作
2068
+ if (beforeEventData.cancel) {
2069
+ resolve(null);
2070
+ return;
2071
+ }
2072
+
2073
+ // 执行实际操作
2074
+ let result = null;
2075
+ const obj = this.data[key];
2076
+ if (obj && obj.value && obj.value.members && obj.value.members.hasOwnProperty(member)) {
2077
+ result = obj.value.members[member];
2078
+ }
2079
+
2080
+ // 触发后置事件
2081
+ this.emit('zscore_after', {
2082
+ key,
2083
+ value: { member },
2084
+ result
2085
+ });
2086
+ resolve(result);
2087
+ } catch (error) {
2088
+ // 触发错误事件
2089
+ this.emit('zscore_error', {
2090
+ key,
2091
+ value: { member },
2092
+ error
2093
+ });
2094
+ $.log.error('[cachebase] zscore操作失败:', error);
2095
+ resolve(null);
2096
+ }
2097
+ });
2098
+ }
2099
+
2100
+ // 资源销毁方法,包含事件触发
2101
+ dispose() {
2102
+ try {
2103
+ // 触发前置事件
2104
+ const beforeEventData = { cancel: false };
2105
+ this.emit('dispose_before', beforeEventData);
2106
+
2107
+ // 如果事件处理器设置了cancel为true,则取消操作
2108
+ if (beforeEventData.cancel) {
2109
+ return;
2110
+ }
2111
+
2112
+ // 执行实际操作
2113
+ this.data = {};
2114
+ this.list = [];
2115
+ this.dict = this.data; // 同步dict引用
2116
+
2117
+ // 触发后置事件
2118
+ this.emit('dispose_after', {});
2119
+
2120
+ // 最后移除所有监听器(在触发后置事件后)
2121
+ this.removeAllListeners();
2122
+ } catch (error) {
2123
+ // 触发错误事件
2124
+ this.emit('dispose_error', { error });
2125
+ $.log.error('[cachebase] dispose操作失败:', error);
2126
+ }
2127
+ }
38
2128
  }
39
2129
 
40
- /**
41
- * @description 获取缓存对象
42
- * @param {String} key 键
43
- * @return {String} 对象
44
- */
45
- CacheBase.prototype.getObj = function(key) {
46
- var obj = this.list.getObj({
47
- name: key
48
- });
49
- if (obj && obj.expires) {
50
- var cha = Date.parse(obj.expires) - Date.parse(new Date());
51
- if (cha < 1) {
52
- this.delObj(key);
53
- obj = undefined;
54
- }
55
- }
56
- return obj;
57
- };
58
- /**
59
- * @description 删除缓存对象
60
- * @param {String} key 键
61
- * @return {Number} 成功返回1,否则返回0
62
- */
63
- CacheBase.prototype.delObj = function(key) {
64
- this.list.del({
65
- name: key
66
- }, true);
67
- return 1;
68
- };
69
-
70
- /**
71
- * @description 设置缓存对象
72
- * @param {Object} obj 值
73
- * @return {Number} 成功返回1,否则返回0
74
- */
75
- CacheBase.prototype.addObj = function(obj) {
76
- obj.id = obj.name.md5();
77
- var maxAge = obj.maxAge;
78
- if (maxAge > 0) {
79
- // 如果maxAge大于0则设置缓存时长
80
- obj.expires = new Date().addSeconds(maxAge).toUTCString();
81
- } else {
82
- obj.maxAge = -1;
83
- obj.expires = null;
84
- }
85
- this.list.push(obj);
86
- return 1;
87
- };
88
-
89
- /**
90
- * @description 查询或是设置缓存过期时间
91
- * @param {String} key 键
92
- * @param {Number} maxAge 秒, 为空则查询有效时长
93
- * @return {Promise|Number|Boolean} 查询时长或设置结果, 时长为-1表示永不过期
94
- */
95
- CacheBase.prototype.ttl = async function(key, maxAge) {
96
- var _this = this;
97
- return new Promise((resolve, reject) => {
98
- var obj = _this.getObj(key);
99
- if (obj) {
100
- if (maxAge === undefined) {
101
- // 如果maxAge没有设置则查询时长
102
- if (obj.expires) {
103
- // 如果有效期
104
- var cha = Date.parse(obj.expires) - Date.parse(new Date());
105
- maxAge = parseInt(cha / 1000);
106
- } else {
107
- maxAge = obj.maxAge;
108
- }
109
- resolve(maxAge);
110
- return;
111
- } else if (maxAge > 0) {
112
- // 如果maxAge大于0则设置缓存时长
113
- obj.maxAge = maxAge;
114
- obj.expires = new Date().addSeconds(maxAge).toUTCString();
115
- } else if (maxAge < 0) {
116
- // 如果maxAge小于0则设置缓存时长为永久
117
- obj.maxAge = -1;
118
- obj.expires = null;
119
- } else {
120
- // 如果maxAge等于0则设置删除缓存
121
- _this.delObj(key);
122
- }
123
- resolve(1);
124
- } else {
125
- resolve(0);
126
- }
127
- });
128
- };
129
- /**
130
- * @description 增加整数值(负数为减)
131
- * @param {String} key 键
132
- * @param {Number} num 数值
133
- * @return {Promise|Number} 计算后的结果
134
- */
135
- CacheBase.prototype.addInt = async function(key, num) {
136
- var _this = this;
137
- return new Promise((resolve, reject) => {
138
- var obj = _this.getObj(key);
139
- if (obj) {
140
- obj.value += num;
141
- resolve(obj.value);
142
- } else {
143
- resolve(0);
144
- }
145
- });
146
- };
147
- /**
148
- * @description 增加浮点数值(负数为减)
149
- * @param {String} key 键
150
- * @param {Number} num 数值
151
- * @return {Promise|Number} 计算后的结果
152
- */
153
- CacheBase.prototype.addFloat = async function(key, num) {
154
- var _this = this;
155
- return new Promise((resolve, reject) => {
156
- var obj = _this.getObj(key);
157
- if (obj) {
158
- obj.value += num;
159
- resolve(obj.value);
160
- } else {
161
- resolve(0);
162
- }
163
- });
164
- };
165
- /**
166
- * @description 增加字符串值到指定缓存
167
- * @param {String} key 键
168
- * @param {String} str 添加的字符串
169
- * @return {Promise|String} 添加后的字符串
170
- */
171
- CacheBase.prototype.addStr = async function(key, str) {
172
- var _this = this;
173
- return new Promise((resolve, reject) => {
174
- var obj = _this.getObj(key);
175
- if (obj) {
176
- obj.value += str;
177
- resolve(obj.value);
178
- } else {
179
- resolve(0);
180
- }
181
- });
182
- };
183
- /**
184
- * @description 删除缓存
185
- * @param {String} key 键
186
- * @return {Promise|Boolean} 成功返回true,失败返回false
187
- */
188
- CacheBase.prototype.del = async function(key) {
189
- var _this = this;
190
- return new Promise((resolve, reject) => {
191
- var ret = _this.delObj(key);
192
- resolve(ret);
193
- });
194
- };
195
- /**
196
- * @description 修改缓存
197
- * @param {String} key 键
198
- * @param {Object} value 值
199
- * @param {Number} maxAge 秒
200
- * @return {Object} 值
201
- */
202
- CacheBase.prototype.setVal = function(key, value, maxAge) {
203
- var _this = this;
204
- var obj = _this.getObj(key);
205
- if (obj) {
206
- obj.value = value;
207
- if (maxAge !== undefined) {
208
- _this.ttl(key, maxAge);
209
- }
210
- } else {
211
- if (maxAge === undefined) {
212
- maxAge = -1;
213
- }
214
- obj = {
215
- name: key,
216
- value: value,
217
- maxAge: maxAge
218
- };
219
- _this.addObj(obj);
220
- }
221
- return obj.value;
222
- };
223
- /**
224
- * @description 修改缓存
225
- * @param {String} key 键
226
- * @param {Object} value 值
227
- * @param {Number} maxAge 秒
228
- * @return {Promise|Object} 值
229
- */
230
- CacheBase.prototype.set = async function(key, value, maxAge) {
231
- var _this = this;
232
- return new Promise((resolve, reject) => {
233
- var ret = _this.setVal(key, value, maxAge);
234
- resolve(ret);
235
- });
236
- };
237
- /**
238
- * @description 增加缓存 增加缓存和修改缓存不一样, 如果键存在则不会增加
239
- * @param {String} key 键
240
- * @param {Object} value 值
241
- * @param {Number} maxAge 秒
242
- * @return {Promise<Object>} 添加成功返回值, 如果已存在则返回null
243
- */
244
- CacheBase.prototype.add = async function(key, value, maxAge) {
245
- var _this = this;
246
- return new Promise((resolve, reject) => {
247
- var obj = _this.getObj(key);
248
- if (!obj) {
249
- var ret = _this.setVal(key, value, maxAge);
250
- resolve(ret);
251
- } else {
252
- resolve(0);
253
- }
254
- });
255
- };
256
- /**
257
- * @description 查询缓存
258
- * @param {String} key 键
259
- * @return {Promise|Object} 查询值
260
- */
261
- CacheBase.prototype.get = async function(key) {
262
- var _this = this;
263
- return new Promise((resolve, reject) => {
264
- var obj = _this.getObj(key);
265
- if (obj) {
266
- resolve(obj.value);
267
- } else {
268
- resolve(undefined);
269
- }
270
- });
271
- };
272
- /**
273
- * @description 判断键是否存在
274
- * @param {String} key 键
275
- * @return {Promise|Boolean} 有返回true, 没有返回false
276
- */
277
- CacheBase.prototype.has = async function(key) {
278
- var _this = this;
279
- return new Promise((resolve, reject) => {
280
- var obj = _this.getObj(key);
281
- resolve(obj ? 1 : 0);
282
- });
283
- };
284
- /**
285
- * @description 查询缓存的字符串中的一段字符串
286
- * @param {String} key 键
287
- * @param {Number} start 开始位置
288
- * @param {Number} end 结束位置
289
- * @return {Promise|String} 查询值
290
- */
291
- CacheBase.prototype.getrange = async function(key, start, end) {
292
- var _this = this;
293
- return new Promise((resolve, reject) => {
294
- var obj = _this.getObj(key);
295
- if (obj) {
296
- resolve(obj.value.substring(start, end));
297
- } else {
298
- resolve('');
299
- }
300
- });
301
- };
302
- /**
303
- * @description 在值的指定位置开始增加一段字符串
304
- * @param {String} key 键
305
- * @param {Number} index 开始位置
306
- * @param {String} value 变更的值
307
- * @return {Promise|Number} 字符串长度
308
- */
309
- CacheBase.prototype.setrange = async function(key, index, value) {
310
- var _this = this;
311
- return new Promise((resolve, reject) => {
312
- var obj = _this.getObj(key);
313
- if (obj) {
314
- var val = obj.value;
315
- var start = val.substring(0, index);
316
- var end = val.substring(index, val.length);
317
- obj.value = start + value + end;
318
- resolve(obj.value);
319
- } else {
320
- resolve('');
321
- }
322
- });
323
- };
324
- /**
325
- * @description 清空缓存
326
- * @param {String} key 键, 为空则清空所有
327
- * @return {Promise|Array} 执行结果
328
- */
329
- CacheBase.prototype.clear = async function(key) {
330
- var _this = this;
331
- return new Promise((resolve, reject) => {
332
- if (key) {
333
- for (var i = this.list.length - 1; i >= 0; i--) {
334
- if (this.list[i].name.has(key)) {
335
- _this.delObj(this.list[i].name);
336
- }
337
- }
338
- } else {
339
- for (var i = this.list.length - 1; i >= 0; i--) {
340
- _this.delObj(this.list[i].name);
341
- }
342
- }
343
- resolve(1);
344
- });
345
- };
346
- /**
347
- * @description 排序
348
- * @param {String} key 键
349
- * @param {String} way = [asc|desc]排序方式, 可以为空
350
- * @param {String} obj_key 排序成员的键
351
- * @return {Promise|Array} 排序后的数组
352
- */
353
- CacheBase.prototype.sort = async function(key, way, obj_key) {
354
- var _this = this;
355
- return new Promise((resolve, reject) => {
356
- var obj = _this.getObj(key);
357
- if (obj) {
358
- if (obj.value.constructor == Array) {
359
- obj.value.sortBy(way, obj_key);
360
- resolve(1);
361
- } else {
362
- resolve(-1);
363
- }
364
- } else {
365
- resolve(0);
366
- }
367
- });
368
- };
369
- /**
370
- * @description 获取所有键名
371
- * @param {String} key 键 支持*号, 前面加*表示后面名称一致, 前后加*表示包含名称, 后面加*表示前面名称一致
372
- * @return {Promise|Array} 键数组
373
- */
374
- CacheBase.prototype.keys = async function(key) {
375
- var _this = this;
376
- return new Promise((resolve, reject) => {
377
- if (key) {
378
- var list = _this.list.search(key, 'name');
379
- resolve(list.toArr('name'));
380
- } else {
381
- resolve(_this.list.toArr('name'));
382
- }
383
- });
384
- };
385
- /**
386
- * @description 修改数组缓存
387
- * @param {String} key 键
388
- * @param {Object} value 值
389
- * @param {Number} maxAge 秒
390
- * @return {Promise|Array} 执行结果
391
- */
392
- CacheBase.prototype.list_set = async function(key, value, maxAge) {
393
- var _this = this;
394
- return new Promise((resolve, reject) => {
395
- var ret = _this.setVal(key, value, maxAge);
396
- resolve(ret);
397
- });
398
- };
399
- /**
400
- * @description 数组缓存追加对象
401
- * @param {String} key 键
402
- * @param {Object} value 值
403
- * @return {Promise|String} 追加后的数组
404
- */
405
- CacheBase.prototype.list_add = async function(key, value) {
406
- var _this = this;
407
- return new Promise((resolve, reject) => {
408
- var obj = _this.getObj(key);
409
- if (obj) {
410
- var arr = obj.value;
411
- if (arr.constructor == Array) {
412
- arr.push(value);
413
- obj.value = arr;
414
- resolve(1);
415
- } else {
416
- _this.error = "当前缓存值非数组";
417
- resolve(-1);
418
- }
419
- } else {
420
- resolve(0);
421
- }
422
- });
423
- };
424
- /**
425
- * @description 判断成员是否存在
426
- * @param {String} key 键
427
- * @param {Object} value 值
428
- * @return {Promise|Boolean} 存在返回true, 否则返回false
429
- */
430
- CacheBase.prototype.list_has = async function(key, value) {
431
- var _this = this;
432
- return new Promise((resolve, reject) => {
433
- var obj = _this.getObj(key);
434
- if (obj) {
435
- if (obj.value.constructor == Array) {
436
- resolve(obj.value.has(value));
437
- } else {
438
- _this.error = "当前缓存值非数组";
439
- resolve(-1);
440
- }
441
- } else {
442
- resolve(0);
443
- }
444
- });
445
- };
446
- /**
447
- * @description 查询数组缓存
448
- * @param {String} key 键
449
- * @param {Number} start 起始位置
450
- * @param {Number} end 结束位置
451
- * @return {Promise|Array} 查询到的数组
452
- */
453
- CacheBase.prototype.list_get = async function(key, start, end) {
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
- var lt = obj.value;
460
- if (!end) {
461
- end = lt.length;
462
- }
463
- if (!start) {
464
- start = 0;
465
- }
466
- var list = [];
467
- for (var i = start; i < end; i++) {
468
- list.push(lt[i]);
469
- }
470
- resolve(list);
471
- } else {
472
- _this.error = "当前缓存值非数组";
473
- resolve([]);
474
- }
475
- } else {
476
- resolve([]);
477
- }
478
- });
479
- };
480
- /**
481
- * @description 清空数组缓存
482
- * @param {String} key 键
483
- * @param {Array} value 新成员, 没有则删除数组
484
- * @return {Promise|Boolean} 成功返回true,是否返回false
485
- */
486
- CacheBase.prototype.list_clear = async function(key, value) {
487
- var _this = this;
488
- return new Promise((resolve, reject) => {
489
- if (value) {
490
- var obj = _this.getObj(key);
491
- if (obj) {
492
- obj.value = value;
493
- resolve(1);
494
- } else {
495
- resolve(0);
496
- }
497
- } else {
498
- var ret = _this.del(key);
499
- resolve(ret);
500
- }
501
- });
502
- };
503
- /**
504
- * @description 到期通知
505
- * @param {Object} obj 对象
506
- */
507
- CacheBase.prototype.notity = function(obj) {
508
- if (this.func) {
509
- this.func(obj);
510
- }
511
- };
512
-
513
- // 导出CacheBase函数
2130
+ // 导出CacheBase类
514
2131
  module.exports = CacheBase;
2132
+