mm_mongodb 1.4.6 → 1.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -3
- package/index.js +498 -205
- package/package.json +3 -4
- package/test.js +2 -2
- package/test2.js +20 -19
- package/test_events.js +139 -0
- package/test_redis_api.js +135 -0
- package/test_redis_compatibility.js +155 -123
- package/cache.js +0 -2866
- package/compatibility_table.md +0 -85
package/package.json
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mm_mongodb",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.8",
|
|
4
4
|
"description": "MongoDB数据库操作模块,提供简洁易用的API、缓存功能以及完整的Redis兼容接口,支持事件系统、事务和连接池管理",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "node test.js",
|
|
8
8
|
"test:events": "node test_events.js",
|
|
9
|
-
"test:redis": "node
|
|
10
|
-
"test:redis-
|
|
11
|
-
"test:advanced": "node test_advanced.js"
|
|
9
|
+
"test:redis": "node test_redis_api.js",
|
|
10
|
+
"test:redis-compatibility": "node test_redis_compatibility.js"
|
|
12
11
|
},
|
|
13
12
|
"repository": {
|
|
14
13
|
"type": "git",
|
package/test.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const MongoDB = require('./index.js').MongoDB;
|
|
2
|
-
const mongodb_admin = require('./index.js').
|
|
2
|
+
const mongodb_admin = require('./index.js').mongodb_admin;
|
|
3
3
|
|
|
4
4
|
async function test2() {
|
|
5
5
|
var mb = mongodb_admin("sys");
|
|
@@ -13,7 +13,7 @@ test2();
|
|
|
13
13
|
async function test() {
|
|
14
14
|
console.log("测试开始");
|
|
15
15
|
// 实例化构造函数,使用正确的参数
|
|
16
|
-
var mb = new MongoDB("default"
|
|
16
|
+
var mb = new MongoDB("default");
|
|
17
17
|
mb.setConfig();
|
|
18
18
|
|
|
19
19
|
await mb.open();
|
package/test2.js
CHANGED
|
@@ -1,18 +1,11 @@
|
|
|
1
|
-
const {
|
|
1
|
+
const { MongoDB, mongoDB_admin } = require('./index.js');
|
|
2
2
|
|
|
3
|
-
async function test2() {
|
|
4
|
-
var mb = mongodb_cache_admin("sys");
|
|
5
|
-
mb.setConfig();
|
|
6
|
-
// mb.open();
|
|
7
|
-
console.log(mb);
|
|
8
|
-
}
|
|
9
|
-
test2();
|
|
10
3
|
|
|
11
4
|
/* 调用示例 */
|
|
12
5
|
async function test() {
|
|
13
6
|
console.log("测试开始");
|
|
14
7
|
// 实例化构造函数,传入服务器地址和数据库名
|
|
15
|
-
var mb = new
|
|
8
|
+
var mb = new MongoDB("localhost");
|
|
16
9
|
mb.setConfig();
|
|
17
10
|
|
|
18
11
|
await mb.open();
|
|
@@ -27,17 +20,19 @@ async function test() {
|
|
|
27
20
|
mb.table = "mm_table";
|
|
28
21
|
|
|
29
22
|
console.log("查询", mb.conn);
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
// 直接使用find方法查询数据
|
|
24
|
+
var ret = await mb.find({ name: '李四' });
|
|
25
|
+
console.log("查询李四", ret);
|
|
32
26
|
|
|
33
|
-
ret = await mb.
|
|
34
|
-
console.log("查询张三",ret);
|
|
27
|
+
ret = await mb.find({ name: '张三' });
|
|
28
|
+
console.log("查询张三", ret);
|
|
35
29
|
|
|
36
30
|
// 选择要操作的表
|
|
37
31
|
mb.table = 'mm_table';
|
|
38
32
|
|
|
39
33
|
// 添加一条数据
|
|
40
|
-
ret = await mb.
|
|
34
|
+
ret = await mb.addObj({
|
|
35
|
+
name: "张三",
|
|
41
36
|
age: 21,
|
|
42
37
|
sex: true
|
|
43
38
|
});
|
|
@@ -45,13 +40,19 @@ console.log("查询", mb.conn);
|
|
|
45
40
|
|
|
46
41
|
|
|
47
42
|
// 修改一条数据
|
|
48
|
-
ret = await mb.
|
|
43
|
+
ret = await mb.addObj({
|
|
44
|
+
name: "李四",
|
|
49
45
|
age: 24,
|
|
50
46
|
sex: false
|
|
51
47
|
});
|
|
52
|
-
console.log("
|
|
53
|
-
|
|
48
|
+
console.log("添加一条数据", ret);
|
|
49
|
+
|
|
50
|
+
// 查询
|
|
51
|
+
ret = await mb.find({ name: "张三" });
|
|
52
|
+
console.log("查询张三", ret);
|
|
53
|
+
|
|
54
|
+
// 关闭连接
|
|
55
|
+
await mb.close();
|
|
54
56
|
console.log("测试完成");
|
|
55
57
|
}
|
|
56
|
-
|
|
57
|
-
test();
|
|
58
|
+
test();
|
package/test_events.js
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// 事件测试文件
|
|
2
|
+
const { MongoDB, mongodb_admin } = require('./index');
|
|
3
|
+
|
|
4
|
+
// 事件统计对象
|
|
5
|
+
const eventStats = {
|
|
6
|
+
set_before: 0,
|
|
7
|
+
set_after: 0,
|
|
8
|
+
set_error: 0,
|
|
9
|
+
del_before: 0,
|
|
10
|
+
del_after: 0,
|
|
11
|
+
del_error: 0,
|
|
12
|
+
add_before: 0,
|
|
13
|
+
add_after: 0,
|
|
14
|
+
add_error: 0
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// 重置事件统计
|
|
18
|
+
function resetEventStats() {
|
|
19
|
+
Object.keys(eventStats).forEach(key => {
|
|
20
|
+
eventStats[key] = 0;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// 注册所有事件监听器
|
|
25
|
+
function registerEventListeners(cache) {
|
|
26
|
+
// 注册set相关事件
|
|
27
|
+
cache.on('set_before', (data) => {
|
|
28
|
+
eventStats.set_before++;
|
|
29
|
+
console.log('触发 set_before 事件:', data);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
cache.on('set_after', (data) => {
|
|
33
|
+
eventStats.set_after++;
|
|
34
|
+
console.log('触发 set_after 事件:', data);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
cache.on('set_error', (data) => {
|
|
38
|
+
eventStats.set_error++;
|
|
39
|
+
console.log('触发 set_error 事件:', data);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// 注册del相关事件
|
|
43
|
+
cache.on('del_before', (data) => {
|
|
44
|
+
eventStats.del_before++;
|
|
45
|
+
console.log('触发 del_before 事件:', data);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
cache.on('del_after', (data) => {
|
|
49
|
+
eventStats.del_after++;
|
|
50
|
+
console.log('触发 del_after 事件:', data);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
cache.on('del_error', (data) => {
|
|
54
|
+
eventStats.del_error++;
|
|
55
|
+
console.log('触发 del_error 事件:', data);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// 注册add相关事件
|
|
59
|
+
cache.on('add_before', (data) => {
|
|
60
|
+
eventStats.add_before++;
|
|
61
|
+
console.log('触发 add_before 事件:', data);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
cache.on('add_after', (data) => {
|
|
65
|
+
eventStats.add_after++;
|
|
66
|
+
console.log('触发 add_after 事件:', data);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
cache.on('add_error', (data) => {
|
|
70
|
+
eventStats.add_error++;
|
|
71
|
+
console.log('触发 add_error 事件:', data);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// 运行事件测试
|
|
76
|
+
async function runEventTests() {
|
|
77
|
+
try {
|
|
78
|
+
// 获取Redis兼容缓存实例
|
|
79
|
+
const cache = mongodb_admin('cache');
|
|
80
|
+
|
|
81
|
+
// 注册事件监听器
|
|
82
|
+
registerEventListeners(cache);
|
|
83
|
+
|
|
84
|
+
console.log('\n--- 测试set方法事件 ---');
|
|
85
|
+
await cache.set('event_test_key', 'test_value');
|
|
86
|
+
|
|
87
|
+
console.log('\n--- 测试add方法事件 ---');
|
|
88
|
+
await cache.add('event_test_key2', 'add_value');
|
|
89
|
+
|
|
90
|
+
console.log('\n--- 测试del方法事件 ---');
|
|
91
|
+
await cache.del('event_test_key');
|
|
92
|
+
|
|
93
|
+
console.log('\n--- 测试add到已存在键的事件 ---');
|
|
94
|
+
await cache.add('event_test_key2', 'should_not_replace');
|
|
95
|
+
await cache.del('event_test_key2');
|
|
96
|
+
|
|
97
|
+
// 显示事件统计
|
|
98
|
+
console.log('\n=== 事件触发统计 ===');
|
|
99
|
+
console.log(eventStats);
|
|
100
|
+
|
|
101
|
+
// 计算事件触发率
|
|
102
|
+
const setEventsTriggered = eventStats.set_before === 1 && eventStats.set_after === 1;
|
|
103
|
+
const delEventsTriggered = eventStats.del_before === 2 && eventStats.del_after === 2;
|
|
104
|
+
const addEventsTriggered = eventStats.add_before === 2 && eventStats.add_after === 2;
|
|
105
|
+
|
|
106
|
+
console.log('\n=== 事件测试结果 ===');
|
|
107
|
+
if (setEventsTriggered && delEventsTriggered && addEventsTriggered) {
|
|
108
|
+
console.log('✅ 所有事件测试通过!');
|
|
109
|
+
} else {
|
|
110
|
+
console.log('❌ 部分事件测试失败');
|
|
111
|
+
if (!setEventsTriggered) console.log(' - set事件');
|
|
112
|
+
if (!delEventsTriggered) console.log(' - del事件');
|
|
113
|
+
if (!addEventsTriggered) console.log(' - add事件');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// 显示事件触发率
|
|
117
|
+
console.log('\n事件触发率统计:');
|
|
118
|
+
console.log(`set方法事件触发率: ${setEventsTriggered ? '100%' : '失败'}`);
|
|
119
|
+
console.log(`del方法事件触发率: ${delEventsTriggered ? '100%' : '失败'}`);
|
|
120
|
+
console.log(`add方法事件触发率: ${addEventsTriggered ? '100%' : '失败'}`);
|
|
121
|
+
|
|
122
|
+
// 清理连接
|
|
123
|
+
await cache.close();
|
|
124
|
+
|
|
125
|
+
if (setEventsTriggered && delEventsTriggered && addEventsTriggered) {
|
|
126
|
+
console.log('\n🎉 所有事件测试全部通过!');
|
|
127
|
+
process.exit(0);
|
|
128
|
+
} else {
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
} catch (error) {
|
|
133
|
+
console.error('测试过程中出错:', error);
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// 运行测试
|
|
139
|
+
runEventTests();
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Redis API测试文件
|
|
2
|
+
const { MongoDB, mongodb_admin } = require('./index');
|
|
3
|
+
|
|
4
|
+
async function runRedisApiTests() {
|
|
5
|
+
console.log('开始测试Redis兼容API...\n');
|
|
6
|
+
|
|
7
|
+
let cache = null;
|
|
8
|
+
const testKeys = [];
|
|
9
|
+
|
|
10
|
+
try {
|
|
11
|
+
// 获取缓存实例
|
|
12
|
+
cache = mongodb_admin('cache');
|
|
13
|
+
|
|
14
|
+
// 测试set方法
|
|
15
|
+
console.log('测试set方法:');
|
|
16
|
+
const setResult = await cache.set('test_key1', 'Hello Redis!');
|
|
17
|
+
console.log('set结果:', setResult);
|
|
18
|
+
testKeys.push('test_key1');
|
|
19
|
+
|
|
20
|
+
// 测试get方法
|
|
21
|
+
console.log('\n测试get方法:');
|
|
22
|
+
const getResult = await cache.get('test_key1');
|
|
23
|
+
console.log('get结果:', getResult);
|
|
24
|
+
|
|
25
|
+
// 测试不存在的键
|
|
26
|
+
console.log('\n测试不存在的键:');
|
|
27
|
+
const notExistsResult = await cache.get('non_existent_key');
|
|
28
|
+
console.log('不存在键的get结果:', notExistsResult);
|
|
29
|
+
|
|
30
|
+
// 测试add方法(新键)
|
|
31
|
+
console.log('\n测试add方法(新键):');
|
|
32
|
+
const addNewResult = await cache.add('test_key2', 'Add new value');
|
|
33
|
+
console.log('add结果(新键):', addNewResult);
|
|
34
|
+
testKeys.push('test_key2');
|
|
35
|
+
|
|
36
|
+
// 测试add方法(已存在键)
|
|
37
|
+
console.log('\n测试add方法(已存在键):');
|
|
38
|
+
const addExistingResult = await cache.add('test_key1', 'Should not replace');
|
|
39
|
+
console.log('add结果(已存在键):', addExistingResult);
|
|
40
|
+
|
|
41
|
+
// 验证test_key1未被覆盖
|
|
42
|
+
console.log('\n验证test_key1未被覆盖:');
|
|
43
|
+
const checkResult = await cache.get('test_key1');
|
|
44
|
+
console.log('test_key1当前值:', checkResult);
|
|
45
|
+
|
|
46
|
+
// 测试set方法更新键
|
|
47
|
+
console.log('\n测试set方法更新键:');
|
|
48
|
+
const updateResult = await cache.set('test_key1', 'Updated value!');
|
|
49
|
+
console.log('set更新结果:', updateResult);
|
|
50
|
+
|
|
51
|
+
// 验证更新后的值
|
|
52
|
+
console.log('\n验证更新后的值:');
|
|
53
|
+
const updatedValue = await cache.get('test_key1');
|
|
54
|
+
console.log('test_key1更新后的值:', updatedValue);
|
|
55
|
+
|
|
56
|
+
// 测试exists方法
|
|
57
|
+
console.log('\n测试exists方法:');
|
|
58
|
+
const existsResult = await cache.exists('test_key1');
|
|
59
|
+
console.log('exists结果:', existsResult);
|
|
60
|
+
|
|
61
|
+
const notExistsCheck = await cache.exists('non_existent_key');
|
|
62
|
+
console.log('不存在键的exists结果:', notExistsCheck);
|
|
63
|
+
|
|
64
|
+
// 测试del方法
|
|
65
|
+
console.log('\n测试del方法:');
|
|
66
|
+
const delResult = await cache.del('test_key1');
|
|
67
|
+
console.log('del结果:', delResult);
|
|
68
|
+
|
|
69
|
+
// 验证删除
|
|
70
|
+
const afterDel = await cache.get('test_key1');
|
|
71
|
+
console.log('删除后get结果:', afterDel);
|
|
72
|
+
|
|
73
|
+
// 测试批量操作
|
|
74
|
+
console.log('\n测试批量操作:');
|
|
75
|
+
const batchData = {
|
|
76
|
+
'batch_key1': 'batch_value1',
|
|
77
|
+
'batch_key2': 'batch_value2'
|
|
78
|
+
};
|
|
79
|
+
const msetResult = await cache.mset(batchData);
|
|
80
|
+
console.log('mset结果:', msetResult);
|
|
81
|
+
testKeys.push('batch_key1', 'batch_key2');
|
|
82
|
+
|
|
83
|
+
const mgetResult = await cache.mget(['batch_key1', 'batch_key2', 'non_existent']);
|
|
84
|
+
console.log('mget结果:', mgetResult);
|
|
85
|
+
|
|
86
|
+
// 测试哈希表操作
|
|
87
|
+
console.log('\n测试哈希表操作:');
|
|
88
|
+
await cache.hset('hash_key', 'field1', 'hash_value1');
|
|
89
|
+
testKeys.push('hash_key');
|
|
90
|
+
|
|
91
|
+
const hgetResult = await cache.hget('hash_key', 'field1');
|
|
92
|
+
console.log('hget结果:', hgetResult);
|
|
93
|
+
|
|
94
|
+
const hgetallResult = await cache.hgetall('hash_key');
|
|
95
|
+
console.log('hgetall结果:', hgetallResult);
|
|
96
|
+
|
|
97
|
+
console.log('\n所有测试完成!');
|
|
98
|
+
|
|
99
|
+
// 清理测试数据
|
|
100
|
+
if (testKeys.length > 0) {
|
|
101
|
+
for (const key of testKeys) {
|
|
102
|
+
await cache.del(key);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// 关闭连接
|
|
107
|
+
await cache.close();
|
|
108
|
+
console.log('\n数据库连接已关闭,测试数据已清理');
|
|
109
|
+
process.exit(0);
|
|
110
|
+
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.error('测试过程中出错:', error);
|
|
113
|
+
|
|
114
|
+
// 清理测试数据
|
|
115
|
+
if (cache && testKeys.length > 0) {
|
|
116
|
+
try {
|
|
117
|
+
for (const key of testKeys) {
|
|
118
|
+
await cache.del(key);
|
|
119
|
+
}
|
|
120
|
+
} catch (e) {
|
|
121
|
+
console.error('清理数据时出错:', e);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// 关闭连接
|
|
126
|
+
if (cache) {
|
|
127
|
+
await cache.close();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// 运行测试
|
|
135
|
+
runRedisApiTests();
|
|
@@ -1,123 +1,155 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
1
|
+
// Redis兼容性API测试文件
|
|
2
|
+
const { MongoDB, mongodb_admin } = require('./index');
|
|
3
|
+
|
|
4
|
+
async function runRedisCompatibilityTests() {
|
|
5
|
+
console.log('开始测试Redis兼容API...');
|
|
6
|
+
console.log('正在连接数据库...');
|
|
7
|
+
|
|
8
|
+
let cache = null;
|
|
9
|
+
const testKeys = [];
|
|
10
|
+
|
|
11
|
+
try {
|
|
12
|
+
// 获取缓存实例
|
|
13
|
+
cache = mongodb_admin('cache');
|
|
14
|
+
|
|
15
|
+
console.log('数据库连接成功!\n');
|
|
16
|
+
|
|
17
|
+
// 核心缓存方法测试
|
|
18
|
+
console.log('=== 测试核心缓存方法 ===');
|
|
19
|
+
const setResult = await cache.set('test_key', 'test_value');
|
|
20
|
+
console.log('set结果:', setResult);
|
|
21
|
+
testKeys.push('test_key');
|
|
22
|
+
|
|
23
|
+
const getResult = await cache.get('test_key');
|
|
24
|
+
console.log('get结果:', getResult);
|
|
25
|
+
|
|
26
|
+
const existsResult = await cache.exists('test_key');
|
|
27
|
+
console.log('exists结果:', existsResult);
|
|
28
|
+
console.log('');
|
|
29
|
+
|
|
30
|
+
// 哈希表操作测试
|
|
31
|
+
console.log('=== 测试哈希表操作 ===');
|
|
32
|
+
await cache.hset('test_hash', 'field1', 'value1');
|
|
33
|
+
testKeys.push('test_hash');
|
|
34
|
+
|
|
35
|
+
const hgetResult = await cache.hget('test_hash', 'field1');
|
|
36
|
+
console.log('hget结果:', hgetResult);
|
|
37
|
+
|
|
38
|
+
const hgetallResult = await cache.hgetall('test_hash');
|
|
39
|
+
console.log('hgetall结果:', hgetallResult);
|
|
40
|
+
|
|
41
|
+
const hmgetResult = await cache.hmget('test_hash', ['field1', 'field2']);
|
|
42
|
+
console.log('hmget结果:', hmgetResult);
|
|
43
|
+
|
|
44
|
+
const hkeysResult = await cache.hkeys('test_hash');
|
|
45
|
+
console.log('hkeys结果:', hkeysResult);
|
|
46
|
+
|
|
47
|
+
const hvalsResult = await cache.hvals('test_hash');
|
|
48
|
+
console.log('hvals结果:', hvalsResult);
|
|
49
|
+
|
|
50
|
+
const hlenResult = await cache.hlen('test_hash');
|
|
51
|
+
console.log('hlen结果:', hlenResult);
|
|
52
|
+
console.log('');
|
|
53
|
+
|
|
54
|
+
// 列表操作测试
|
|
55
|
+
console.log('=== 测试列表操作 ===');
|
|
56
|
+
await cache.lpush('test_list', 'item1');
|
|
57
|
+
testKeys.push('test_list');
|
|
58
|
+
|
|
59
|
+
const llenResult = await cache.llen('test_list');
|
|
60
|
+
console.log('llen结果:', llenResult);
|
|
61
|
+
|
|
62
|
+
const lrangeResult = await cache.lrange('test_list', 0, -1);
|
|
63
|
+
console.log('lrange结果:', lrangeResult);
|
|
64
|
+
|
|
65
|
+
const lindexResult = await cache.lindex('test_list', 1);
|
|
66
|
+
console.log('lindex结果:', lindexResult);
|
|
67
|
+
console.log('');
|
|
68
|
+
|
|
69
|
+
// 集合操作测试
|
|
70
|
+
console.log('=== 测试集合操作 ===');
|
|
71
|
+
await cache.saddMulti('test_set', ['member1', 'member2']);
|
|
72
|
+
testKeys.push('test_set');
|
|
73
|
+
|
|
74
|
+
// 使用mget获取集合内容,然后手动去重模拟smembers
|
|
75
|
+
const setContent = await cache.get('test_set');
|
|
76
|
+
const uniqueMembers = Array.from(new Set(setContent.map(m => JSON.stringify(m)))).map(s => JSON.parse(s));
|
|
77
|
+
console.log('集合成员结果:', uniqueMembers);
|
|
78
|
+
|
|
79
|
+
const scardResult = await cache.scard('test_set');
|
|
80
|
+
console.log('scard结果:', scardResult);
|
|
81
|
+
|
|
82
|
+
const sismemberResult = await cache.sismember('test_set', 'member1');
|
|
83
|
+
console.log('sismember结果:', sismemberResult);
|
|
84
|
+
console.log('');
|
|
85
|
+
|
|
86
|
+
// 有序集合操作测试
|
|
87
|
+
console.log('=== 测试有序集合操作 ===');
|
|
88
|
+
await cache.zadd('test_zset', 1, 'zmember1');
|
|
89
|
+
testKeys.push('test_zset');
|
|
90
|
+
|
|
91
|
+
const zcardResult = await cache.zcard('test_zset');
|
|
92
|
+
console.log('zcard结果:', zcardResult);
|
|
93
|
+
|
|
94
|
+
const zscoreResult = await cache.zscore('test_zset', 'zmember1');
|
|
95
|
+
console.log('zscore结果:', zscoreResult);
|
|
96
|
+
|
|
97
|
+
const zrangebyscoreResult = await cache.zrangebyscore('test_zset', 0, 10);
|
|
98
|
+
console.log('zrangebyscore结果:', zrangebyscoreResult);
|
|
99
|
+
console.log('');
|
|
100
|
+
|
|
101
|
+
// 批量操作测试
|
|
102
|
+
console.log('=== 测试批量操作 ===');
|
|
103
|
+
const batchData = {
|
|
104
|
+
'batch_key1': 'batch_value1',
|
|
105
|
+
'batch_key2': 'batch_value2'
|
|
106
|
+
};
|
|
107
|
+
const msetResult = await cache.mset(batchData);
|
|
108
|
+
console.log('mset结果:', msetResult);
|
|
109
|
+
testKeys.push('batch_key1', 'batch_key2');
|
|
110
|
+
|
|
111
|
+
const mgetResult = await cache.mget(['batch_key1', 'batch_key2']);
|
|
112
|
+
console.log('mget结果:', mgetResult);
|
|
113
|
+
console.log('');
|
|
114
|
+
|
|
115
|
+
// 清理测试数据
|
|
116
|
+
console.log('=== 清理测试数据 ===');
|
|
117
|
+
for (const key of testKeys) {
|
|
118
|
+
await cache.del(key);
|
|
119
|
+
}
|
|
120
|
+
console.log('测试数据清理完成');
|
|
121
|
+
console.log('');
|
|
122
|
+
|
|
123
|
+
// 所有测试通过
|
|
124
|
+
console.log('✅ 所有Redis兼容API测试完成!');
|
|
125
|
+
|
|
126
|
+
// 关闭连接
|
|
127
|
+
await cache.close();
|
|
128
|
+
process.exit(0);
|
|
129
|
+
|
|
130
|
+
} catch (error) {
|
|
131
|
+
console.error('测试过程中出错:', error);
|
|
132
|
+
|
|
133
|
+
// 清理测试数据
|
|
134
|
+
if (cache && testKeys.length > 0) {
|
|
135
|
+
try {
|
|
136
|
+
console.log('尝试清理测试数据...');
|
|
137
|
+
for (const key of testKeys) {
|
|
138
|
+
await cache.del(key);
|
|
139
|
+
}
|
|
140
|
+
} catch (e) {
|
|
141
|
+
console.error('清理数据时出错:', e);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// 关闭连接
|
|
146
|
+
if (cache) {
|
|
147
|
+
await cache.close();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// 运行测试
|
|
155
|
+
runRedisCompatibilityTests();
|