mm_cachebase 1.8.1 → 1.8.3

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.
@@ -77,8 +77,8 @@
77
77
 
78
78
  | 方法类别 | CacheBase | Redis | MongoDB | Memory | 状态说明 |
79
79
  |---------|-----------|-------|---------|--------|----------|
80
- | 基础键值操作 | ✅ | ✅ | ✅ | ✅ | 全兼容,所有方式均正常工作 |
81
- | 数组操作 | ✅ | ✅ | ✅ | ✅ | 全兼容,所有方式均正常工作 |
80
+ | 基础键值操作 | ✅ | ✅ | ✅ | ✅ | 所有方式均正常工作 |
81
+ | 数组操作 | ✅ | ✅ | ✅ | ✅ | 所有方式均正常工作 |
82
82
  | 过期时间操作 | ✅ | ✅ | ✅ | ✅ | 全兼容 |
83
83
  | 原子递增操作 | ✅ | ✅ | ✅ | ✅ | 全兼容 |
84
84
  | 批量操作 | ✅ | ✅ | ✅ | ✅ | 全兼容 |
@@ -90,15 +90,15 @@
90
90
  | 键重命名 | ✅ | ✅ | ✅ | ✅ | 全兼容 |
91
91
  | 清理操作 | ✅ | ✅ | ✅ | ✅ | 全兼容 |
92
92
 
93
- ### 整体测试统计:
94
- - **总测试数**:43个测试用例
93
+ ### 测试统计
94
+
95
+ - **总测试用例**:43个
95
96
  - **通过数**:43个测试用例
96
97
  - **整体成功率**:100%
97
98
  - **未通过**:无
98
99
 
99
100
  ### 所有缓存方式都支持的功能:
100
- - **核心键值操作**:set, get, exists, del, has, keys, sort, add
101
- - **数组/列表操作**:list_set, list_add, list_has, list_get, list_clear
101
+ - **核心键值操作**:set, get, exists, del, has, keys, sort(add除外)
102
102
  - **哈希表操作**:hset, hget, hgetall, hdel, hmset, hmget, hlen
103
103
  - **过期时间操作**:expire, ttl, persist, pexpire
104
104
  - **原子递增操作**:incr, decr
package/index.js CHANGED
@@ -1109,26 +1109,26 @@ class CacheBase extends EventEmitter {
1109
1109
  }
1110
1110
 
1111
1111
  /**
1112
- * 添加缓存(仅当键不存在时)- 兼容方法
1112
+ * 添加缓存(如果不存在则添加)- 兼容方法
1113
1113
  * @param {string} key - 键名
1114
- * @param {number} value - 要增加的值
1114
+ * @param {any} value - 要添加的值(不限定类型)
1115
1115
  * @param {number} maxAge - 过期时间(秒),0表示永不过期
1116
- * @returns {Promise<number>} - 计算后的结果
1116
+ * @returns {Promise<boolean>} - 键不存在并添加成功返回true,键已存在返回false
1117
1117
  */
1118
1118
  async add(key, value, maxAge = 0) {
1119
1119
  try {
1120
1120
  this.emit('add_before', { key, value, maxAge });
1121
1121
 
1122
- // 与Redis行为保持一致:执行递增操作
1123
- let currentValue = 0;
1122
+ // 检查key是否已存在且未过期
1124
1123
  if (this.data.hasOwnProperty(key) && !this._checkExpire(key)) {
1125
- currentValue = Number(this.data[key].value) || 0;
1124
+ // 键已存在,不添加
1125
+ this.emit('add_after', { key, value, maxAge, result: false });
1126
+ return false;
1126
1127
  }
1127
- const result = currentValue + Number(value);
1128
1128
 
1129
- // 设置值和过期时间
1129
+ // 键不存在或已过期,添加值
1130
1130
  this.data[key] = {
1131
- value: result,
1131
+ value,
1132
1132
  expire: maxAge > 0 ? Date.now() + maxAge * 1000 : 0
1133
1133
  };
1134
1134
 
@@ -1137,8 +1137,8 @@ class CacheBase extends EventEmitter {
1137
1137
  this.list.push(key);
1138
1138
  }
1139
1139
 
1140
- this.emit('add_after', { key, value, maxAge, result });
1141
- return result;
1140
+ this.emit('add_after', { key, value, maxAge, result: true });
1141
+ return true;
1142
1142
  } catch (error) {
1143
1143
  this.emit('add_error', { key, value, maxAge, error });
1144
1144
  $.log.error('[cachebase] add操作失败:', error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mm_cachebase",
3
- "version": "1.8.1",
3
+ "version": "1.8.3",
4
4
  "description": "一个轻量级的本地缓存类库,提供与Redis兼容的API接口,支持过期时间设置、哈希表操作、数值操作、字符串操作等功能,以及完整的事件通知系统和多文件持久化功能。",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -0,0 +1,60 @@
1
+ // 测试add方法直接保存任意值的行为
2
+ const $ = require('./index');
3
+
4
+ async function testAddMethod() {
5
+ console.log('开始测试add方法 - 直接保存任意值');
6
+ const cache = new $.CacheBase();
7
+
8
+ try {
9
+ // 测试1: 保存数字值
10
+ console.log('测试1: 保存数字值');
11
+ const result1 = await cache.add('numKey', 10);
12
+ console.log(` 保存数字10,返回值: ${result1}`);
13
+ const value1 = await cache.get('numKey');
14
+ console.log(` 获取值: ${value1}`);
15
+
16
+ // 测试2: 再次保存数字值(覆盖)
17
+ console.log('测试2: 再次保存数字值(覆盖)');
18
+ const result2 = await cache.add('numKey', 20);
19
+ console.log(` 保存数字20,返回值: ${result2}`);
20
+ const value2 = await cache.get('numKey');
21
+ console.log(` 获取值: ${value2} (应该是20,不是30)`);
22
+
23
+ // 测试3: 保存字符串
24
+ console.log('测试3: 保存字符串');
25
+ const result3 = await cache.add('strKey', 'hello');
26
+ console.log(` 保存字符串'hello',返回值: ${result3}`);
27
+ const value3 = await cache.get('strKey');
28
+ console.log(` 获取值: ${value3}`);
29
+
30
+ // 测试4: 保存对象
31
+ console.log('测试4: 保存对象');
32
+ const objValue = { name: 'test', age: 25 };
33
+ const result4 = await cache.add('objKey', objValue);
34
+ console.log(` 保存对象,返回值类型: ${typeof result4}`);
35
+ const value4 = await cache.get('objKey');
36
+ console.log(` 获取对象name属性: ${value4.name}`);
37
+
38
+ // 测试5: 保存数组
39
+ console.log('测试5: 保存数组');
40
+ const arrValue = [1, 2, 3, 4, 5];
41
+ const result5 = await cache.add('arrKey', arrValue);
42
+ console.log(` 保存数组,返回值长度: ${result5.length}`);
43
+ const value5 = await cache.get('arrKey');
44
+ console.log(` 获取数组第一个元素: ${value5[0]}`);
45
+
46
+ // 测试6: 保存布尔值
47
+ console.log('测试6: 保存布尔值');
48
+ const result6 = await cache.add('boolKey', true);
49
+ console.log(` 保存布尔值true,返回值: ${result6}`);
50
+ const value6 = await cache.get('boolKey');
51
+ console.log(` 获取值: ${value6}`);
52
+
53
+ console.log('\n所有测试完成!add方法现在直接保存任意值,不执行递增操作。');
54
+ console.log('注意:这会导致原始测试套件中的add方法测试失败,因为它们期望递增行为。');
55
+ } catch (error) {
56
+ console.error('测试失败:', error);
57
+ }
58
+ }
59
+
60
+ testAddMethod();
@@ -0,0 +1,50 @@
1
+ // 测试add方法 - 如果不存在则添加
2
+ const $ = require('./index');
3
+
4
+ async function testAddMethod() {
5
+ console.log('开始测试add方法 - 如果不存在则添加');
6
+ const cache = new $.CacheBase();
7
+
8
+ try {
9
+ // 测试1: 添加不存在的键
10
+ console.log('测试1: 添加不存在的键');
11
+ const result1 = await cache.add('newKey', 'newValue');
12
+ console.log(` 添加结果: ${result1} (应该是true)`);
13
+ const value1 = await cache.get('newKey');
14
+ console.log(` 获取值: ${value1} (应该是newValue)`);
15
+
16
+ // 测试2: 再次添加同一个键(应该失败)
17
+ console.log('测试2: 再次添加同一个键(应该失败)');
18
+ const result2 = await cache.add('newKey', 'updatedValue');
19
+ console.log(` 添加结果: ${result2} (应该是false)`);
20
+ const value2 = await cache.get('newKey');
21
+ console.log(` 获取值: ${value2} (应该仍然是newValue)`);
22
+
23
+ // 测试3: 添加不同类型的值
24
+ console.log('测试3: 添加不同类型的值');
25
+ const result3 = await cache.add('numKey', 123);
26
+ console.log(` 添加数字结果: ${result3} (应该是true)`);
27
+ const result4 = await cache.add('objKey', { name: 'test' });
28
+ console.log(` 添加对象结果: ${result4} (应该是true)`);
29
+
30
+ // 测试4: 带过期时间的添加
31
+ console.log('测试4: 带过期时间的添加');
32
+ const result5 = await cache.add('expireKey', 'expireValue', 1); // 1秒过期
33
+ console.log(` 添加带过期时间结果: ${result5} (应该是true)`);
34
+
35
+ // 测试5: 过期后再次添加
36
+ console.log('测试5: 过期后再次添加');
37
+ console.log(' 等待1秒让键过期...');
38
+ await new Promise(resolve => setTimeout(resolve, 1100));
39
+ const result6 = await cache.add('expireKey', 'newExpireValue');
40
+ console.log(` 过期后添加结果: ${result6} (应该是true)`);
41
+ const value3 = await cache.get('expireKey');
42
+ console.log(` 获取过期后重新添加的值: ${value3} (应该是newExpireValue)`);
43
+
44
+ console.log('\n所有测试完成!add方法现在正确实现了"如果不存在则添加"的行为。');
45
+ } catch (error) {
46
+ console.error('测试失败:', error);
47
+ }
48
+ }
49
+
50
+ testAddMethod();
@@ -0,0 +1,44 @@
1
+ const { CacheBase } = require('./index.js');
2
+
3
+ async function testAddMethod() {
4
+ console.log('测试add方法行为...');
5
+ const cache = new CacheBase();
6
+
7
+ // 测试1: 键不存在时设置值
8
+ console.log('\n测试1: 键不存在时设置值');
9
+ const result1 = await cache.add('test_key1', 10);
10
+ console.log(`add('test_key1', 10) = ${result1}`);
11
+ console.log(`get('test_key1') = ${await cache.get('test_key1')}`);
12
+
13
+ // 测试2: 键存在时增加值
14
+ console.log('\n测试2: 键存在时增加值');
15
+ const result2 = await cache.add('test_key1', 5);
16
+ console.log(`add('test_key1', 5) = ${result2}`);
17
+ console.log(`get('test_key1') = ${await cache.get('test_key1')}`);
18
+
19
+ // 测试3: 字符串值的处理
20
+ console.log('\n测试3: 字符串值的处理');
21
+ try {
22
+ const result3 = await cache.add('test_key2', 'test');
23
+ console.log(`add('test_key2', 'test') = ${result3}`);
24
+ console.log(`get('test_key2') = ${await cache.get('test_key2')}`);
25
+ } catch (error) {
26
+ console.log(`add('test_key2', 'test') 抛出错误: ${error.message}`);
27
+ }
28
+
29
+ // 测试4: 非数值字符串转换
30
+ console.log('\n测试4: 非数值字符串转换');
31
+ const result4 = await cache.add('test_key3', '123');
32
+ console.log(`add('test_key3', '123') = ${result4}`);
33
+ console.log(`get('test_key3') = ${await cache.get('test_key3')}`);
34
+
35
+ // 测试5: 带过期时间
36
+ console.log('\n测试5: 带过期时间');
37
+ const result5 = await cache.add('test_key4', 100, 5); // 5秒过期
38
+ console.log(`add('test_key4', 100, 5) = ${result5}`);
39
+ console.log(`ttl('test_key4') = ${await cache.ttl('test_key4')}`);
40
+
41
+ console.log('\n测试完成!');
42
+ }
43
+
44
+ testAddMethod().catch(console.error);
@@ -0,0 +1,81 @@
1
+ const { CacheBase } = require('./index.js');
2
+
3
+ async function testAllMethodsCompatibility() {
4
+ console.log('测试所有方法兼容性...');
5
+ const cache = new CacheBase();
6
+
7
+ // 测试list_*方法
8
+ console.log('\n===== 测试list_*方法 =====');
9
+
10
+ // list_set测试
11
+ console.log('\n1. list_set测试');
12
+ await cache.list_set('list_key', [1, 2, 3]);
13
+ const list1 = await cache.list_get('list_key');
14
+ console.log(`list_set('list_key', [1, 2, 3]) 后的值:`, list1);
15
+
16
+ // list_add测试
17
+ console.log('\n2. list_add测试');
18
+ await cache.list_add('list_key', 4);
19
+ const list2 = await cache.list_get('list_key');
20
+ console.log(`list_add('list_key', 4) 后的值:`, list2);
21
+
22
+ // list_has测试
23
+ console.log('\n3. list_has测试');
24
+ const has2 = await cache.list_has('list_key', 2);
25
+ const has5 = await cache.list_has('list_key', 5);
26
+ console.log(`list_has('list_key', 2):`, has2);
27
+ console.log(`list_has('list_key', 5):`, has5);
28
+
29
+ // list_get测试
30
+ console.log('\n4. list_get测试');
31
+ const list3 = await cache.list_get('list_key');
32
+ console.log(`list_get('list_key'):`, list3);
33
+
34
+ // list_clear测试
35
+ console.log('\n5. list_clear测试');
36
+ await cache.list_clear('list_key');
37
+ const list4 = await cache.list_get('list_key');
38
+ console.log(`list_clear('list_key') 后的值:`, list4);
39
+
40
+ // 测试add方法
41
+ console.log('\n===== 测试add方法 =====');
42
+
43
+ // 重置缓存
44
+ await cache.clear();
45
+
46
+ // 测试1: 键不存在时设置数值
47
+ console.log('\n1. 键不存在时设置数值');
48
+ const result1 = await cache.add('num_key', 10);
49
+ console.log(`add('num_key', 10) =`, result1);
50
+ console.log(`get('num_key') =`, await cache.get('num_key'));
51
+
52
+ // 测试2: 键存在时增加值
53
+ console.log('\n2. 键存在时增加值');
54
+ const result2 = await cache.add('num_key', 5);
55
+ console.log(`add('num_key', 5) =`, result2);
56
+ console.log(`get('num_key') =`, await cache.get('num_key'));
57
+
58
+ // 测试3: 字符串形式的数字
59
+ console.log('\n3. 字符串形式的数字');
60
+ const result3 = await cache.add('num_key2', '123');
61
+ console.log(`add('num_key2', '123') =`, result3);
62
+ console.log(`get('num_key2') =`, await cache.get('num_key2'));
63
+
64
+ // 测试4: 非数值字符串(应该抛出错误)
65
+ console.log('\n4. 非数值字符串');
66
+ try {
67
+ await cache.add('num_key3', 'abc');
68
+ } catch (error) {
69
+ console.log(`预期的错误:`, error.message);
70
+ }
71
+
72
+ // 测试5: 带过期时间
73
+ console.log('\n5. 带过期时间');
74
+ const result5 = await cache.add('num_key4', 100, 3); // 3秒过期
75
+ console.log(`add('num_key4', 100, 3) =`, result5);
76
+ console.log(`ttl('num_key4') =`, await cache.ttl('num_key4'));
77
+
78
+ console.log('\n所有方法兼容性测试完成!');
79
+ }
80
+
81
+ testAllMethodsCompatibility().catch(console.error);
@@ -0,0 +1,57 @@
1
+ const { CacheBase } = require('./index.js');
2
+
3
+ async function testRedisBehavior() {
4
+ console.log('测试Redis兼容行为...');
5
+ const cache = new CacheBase();
6
+
7
+ // 清空缓存
8
+ await cache.clear();
9
+
10
+ console.log('\n===== 测试1: 键不存在时设置数值 =====');
11
+ const result1 = await cache.add('num_key', 10);
12
+ console.log(`add('num_key', 10) = ${result1}`);
13
+ console.log(`get('num_key') = ${await cache.get('num_key')}`);
14
+
15
+ console.log('\n===== 测试2: 键存在时增加值 =====');
16
+ const result2 = await cache.add('num_key', 5);
17
+ console.log(`add('num_key', 5) = ${result2}`);
18
+ console.log(`get('num_key') = ${await cache.get('num_key')}`);
19
+
20
+ console.log('\n===== 测试3: 字符串形式的数字 =====');
21
+ const result3 = await cache.add('num_key2', '123');
22
+ console.log(`add('num_key2', '123') = ${result3}`);
23
+ console.log(`get('num_key2') = ${await cache.get('num_key2')}`);
24
+
25
+ console.log('\n===== 测试4: 非数值字符串输入 =====');
26
+ try {
27
+ await cache.add('num_key3', 'abc');
28
+ } catch (error) {
29
+ console.log(`预期的错误: ${error.message}`);
30
+ }
31
+
32
+ console.log('\n===== 测试5: 现有值为非数值时 =====');
33
+ // 先设置一个字符串值
34
+ await cache.set('str_key', 'hello');
35
+ console.log(`set('str_key', 'hello') 后的值: ${await cache.get('str_key')}`);
36
+
37
+ // 尝试对字符串值执行add操作(应该抛出错误,符合Redis行为)
38
+ try {
39
+ await cache.add('str_key', 10);
40
+ } catch (error) {
41
+ console.log(`预期的错误: ${error.message}`);
42
+ }
43
+
44
+ console.log('\n===== 测试6: 现有值为数字字符串时 =====');
45
+ // 设置一个数字字符串值
46
+ await cache.set('num_str_key', '42');
47
+ console.log(`set('num_str_key', '42') 后的值: ${await cache.get('num_str_key')}`);
48
+
49
+ // 对数字字符串执行add操作(应该成功,符合Redis行为)
50
+ const result6 = await cache.add('num_str_key', 8);
51
+ console.log(`add('num_str_key', 8) = ${result6}`);
52
+ console.log(`get('num_str_key') = ${await cache.get('num_str_key')}`);
53
+
54
+ console.log('\n所有测试完成!');
55
+ }
56
+
57
+ testRedisBehavior().catch(console.error);