mm_redis 1.7.0 → 1.8.1
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 +53 -3
- package/compatibility_table.md +63 -0
- package/index.js +1035 -68
- package/package.json +20 -10
- package/test_compatibility.js +191 -0
- package/test_mget_mset.js +56 -0
package/package.json
CHANGED
|
@@ -1,33 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mm_redis",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.8.1",
|
|
4
|
+
"description": "高效的Redis客户端封装库,提供连接池管理、数据类型操作、错误处理和批量操作优化",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "node test.js",
|
|
8
|
-
"dev": "nodemon test.js"
|
|
8
|
+
"dev": "nodemon test.js",
|
|
9
|
+
"test:compatibility": "node test_compatibility.js",
|
|
10
|
+
"test:mget_mset": "node test_mget_mset.js"
|
|
9
11
|
},
|
|
10
12
|
"repository": {
|
|
11
13
|
"type": "git",
|
|
12
14
|
"url": "git+https://gitee.com/qiuwenwu91/mm_redis.git"
|
|
13
15
|
},
|
|
14
16
|
"keywords": [
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
17
|
+
"redis",
|
|
18
|
+
"cache",
|
|
19
|
+
"client",
|
|
20
|
+
"connection-pool",
|
|
21
|
+
"pipeline",
|
|
22
|
+
"hash",
|
|
19
23
|
"set",
|
|
20
|
-
"
|
|
21
|
-
"
|
|
24
|
+
"sorted-set",
|
|
25
|
+
"list",
|
|
26
|
+
"redis-client",
|
|
27
|
+
"mm_redis",
|
|
28
|
+
"nodejs"
|
|
22
29
|
],
|
|
23
30
|
"author": "邱文武",
|
|
24
31
|
"license": "ISC",
|
|
25
32
|
"bugs": {
|
|
26
33
|
"url": "https://gitee.com/qiuwenwu91/mm_redis/issues"
|
|
27
34
|
},
|
|
28
|
-
"homepage": "https://
|
|
35
|
+
"homepage": "https://www.npmjs.com/package/mm_redis",
|
|
29
36
|
"dependencies": {
|
|
30
37
|
"mm_logs": "^1.5.2",
|
|
31
38
|
"redis": "^4.7.0"
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=14.0.0"
|
|
32
42
|
}
|
|
33
43
|
}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// 修复导入方式
|
|
2
|
+
const redisModule = require('./index.js');
|
|
3
|
+
const Redis = redisModule.default || redisModule;
|
|
4
|
+
const $ = { log: { debug: console.log, error: console.error } };
|
|
5
|
+
|
|
6
|
+
async function testSetOperations() {
|
|
7
|
+
console.log('=== 测试集合(Set)操作方法 ===');
|
|
8
|
+
|
|
9
|
+
const redis = new Redis({
|
|
10
|
+
host: 'localhost',
|
|
11
|
+
port: 6379,
|
|
12
|
+
prefix: 'test:',
|
|
13
|
+
$: $,
|
|
14
|
+
mock: true
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
try {
|
|
18
|
+
// 测试sadd - 添加成员到集合
|
|
19
|
+
console.log('\n1. 测试sadd方法');
|
|
20
|
+
const saddResult = await redis.sadd('set1', 'member1', 'member2', 'member3');
|
|
21
|
+
console.log('添加成员结果:', saddResult); // 预期: 3
|
|
22
|
+
|
|
23
|
+
// 测试smembers - 获取集合所有成员
|
|
24
|
+
console.log('\n2. 测试smembers方法');
|
|
25
|
+
const members = await redis.smembers('set1');
|
|
26
|
+
console.log('集合成员:', members); // 预期: ['member1', 'member2', 'member3']
|
|
27
|
+
|
|
28
|
+
// 测试sismember - 检查成员是否在集合中
|
|
29
|
+
console.log('\n3. 测试sismember方法');
|
|
30
|
+
const isMember1 = await redis.sismember('set1', 'member1');
|
|
31
|
+
const isMember4 = await redis.sismember('set1', 'member4');
|
|
32
|
+
console.log('member1是否在集合中:', isMember1); // 预期: true
|
|
33
|
+
console.log('member4是否在集合中:', isMember4); // 预期: false
|
|
34
|
+
|
|
35
|
+
// 测试scard - 获取集合成员数量
|
|
36
|
+
console.log('\n4. 测试scard方法');
|
|
37
|
+
const count = await redis.scard('set1');
|
|
38
|
+
console.log('集合成员数量:', count); // 预期: 3
|
|
39
|
+
|
|
40
|
+
// 测试srem - 从集合中移除成员
|
|
41
|
+
console.log('\n5. 测试srem方法');
|
|
42
|
+
const sremResult = await redis.srem('set1', 'member1', 'member4');
|
|
43
|
+
console.log('移除成员结果:', sremResult); // 预期: 1
|
|
44
|
+
|
|
45
|
+
// 测试集合操作后的状态
|
|
46
|
+
const afterRemove = await redis.smembers('set1');
|
|
47
|
+
console.log('移除后集合成员:', afterRemove); // 预期: ['member2', 'member3']
|
|
48
|
+
|
|
49
|
+
// 测试集合运算 - 创建第二个集合
|
|
50
|
+
console.log('\n6. 测试集合运算');
|
|
51
|
+
await redis.sadd('set2', 'member2', 'member4', 'member5');
|
|
52
|
+
console.log('set2成员:', await redis.smembers('set2'));
|
|
53
|
+
|
|
54
|
+
// 测试sinter - 集合交集
|
|
55
|
+
const intersection = await redis.sinter('set1', 'set2');
|
|
56
|
+
console.log('集合交集:', intersection); // 预期: ['member2']
|
|
57
|
+
|
|
58
|
+
// 测试sunion - 集合并集
|
|
59
|
+
const union = await redis.sunion('set1', 'set2');
|
|
60
|
+
console.log('集合并集:', union); // 预期: ['member2', 'member3', 'member4', 'member5']
|
|
61
|
+
|
|
62
|
+
// 测试sdiff - 集合差集
|
|
63
|
+
const diff = await redis.sdiff('set1', 'set2');
|
|
64
|
+
console.log('集合差集(set1-set2):', diff); // 预期: ['member3']
|
|
65
|
+
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error('集合操作测试失败:', error);
|
|
68
|
+
} finally {
|
|
69
|
+
await redis.close();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async function testSortedSetOperations() {
|
|
74
|
+
console.log('\n=== 测试有序集合(Sorted Set)操作方法 ===');
|
|
75
|
+
|
|
76
|
+
const redis = new Redis({
|
|
77
|
+
host: 'localhost',
|
|
78
|
+
port: 6379,
|
|
79
|
+
prefix: 'test:',
|
|
80
|
+
$: $,
|
|
81
|
+
mock: true
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
// 测试zadd - 添加成员到有序集合
|
|
86
|
+
console.log('\n1. 测试zadd方法');
|
|
87
|
+
await redis.zadd('zset1', 10, 'member1');
|
|
88
|
+
await redis.zadd('zset1', 5, 'member2');
|
|
89
|
+
await redis.zadd('zset1', 15, 'member3');
|
|
90
|
+
console.log('已添加成员到有序集合');
|
|
91
|
+
|
|
92
|
+
// 测试zcard - 获取有序集合成员数量
|
|
93
|
+
console.log('\n2. 测试zcard方法');
|
|
94
|
+
const zcount = await redis.zcard('zset1');
|
|
95
|
+
console.log('有序集合成员数量:', zcount); // 预期: 3
|
|
96
|
+
|
|
97
|
+
// 测试zscore - 获取成员分数
|
|
98
|
+
console.log('\n3. 测试zscore方法');
|
|
99
|
+
const score1 = await redis.zscore('zset1', 'member1');
|
|
100
|
+
const score4 = await redis.zscore('zset1', 'member4');
|
|
101
|
+
console.log('member1的分数:', score1); // 预期: 10
|
|
102
|
+
console.log('member4的分数:', score4); // 预期: null
|
|
103
|
+
|
|
104
|
+
// 测试zrank - 获取成员排名
|
|
105
|
+
console.log('\n4. 测试zrank方法');
|
|
106
|
+
const rank1 = await redis.zrank('zset1', 'member1');
|
|
107
|
+
const rank2 = await redis.zrank('zset1', 'member2');
|
|
108
|
+
console.log('member1的排名:', rank1); // 预期: 1
|
|
109
|
+
console.log('member2的排名:', rank2); // 预期: 0
|
|
110
|
+
|
|
111
|
+
// 测试zrange - 获取指定范围的成员
|
|
112
|
+
console.log('\n5. 测试zrange方法');
|
|
113
|
+
const range = await redis.zrange('zset1', 0, -1);
|
|
114
|
+
console.log('所有成员(按分数排序):', range); // 预期: ['member2', 'member1', 'member3']
|
|
115
|
+
|
|
116
|
+
// 测试zincrby - 增加成员分数
|
|
117
|
+
console.log('\n6. 测试zincrby方法');
|
|
118
|
+
const newScore = await redis.zincrby('zset1', 3, 'member2');
|
|
119
|
+
console.log('member2增加后的分数:', newScore); // 预期: 8
|
|
120
|
+
|
|
121
|
+
// 测试分数变化后的排名
|
|
122
|
+
const newRank = await redis.zrank('zset1', 'member2');
|
|
123
|
+
console.log('member2新排名:', newRank); // 预期: 0
|
|
124
|
+
|
|
125
|
+
// 测试zrem - 从有序集合中移除成员
|
|
126
|
+
console.log('\n7. 测试zrem方法');
|
|
127
|
+
const zremResult = await redis.zrem('zset1', 'member1');
|
|
128
|
+
console.log('移除成员结果:', zremResult); // 预期: 1
|
|
129
|
+
|
|
130
|
+
// 测试移除后的集合状态
|
|
131
|
+
const afterRemove = await redis.zrange('zset1', 0, -1);
|
|
132
|
+
console.log('移除后集合成员:', afterRemove); // 预期: ['member2', 'member3']
|
|
133
|
+
|
|
134
|
+
} catch (error) {
|
|
135
|
+
console.error('有序集合操作测试失败:', error);
|
|
136
|
+
} finally {
|
|
137
|
+
await redis.close();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
async function testHashOperations() {
|
|
142
|
+
console.log('\n=== 测试哈希(Hash)操作方法 ===');
|
|
143
|
+
|
|
144
|
+
const redis = new Redis({
|
|
145
|
+
host: 'localhost',
|
|
146
|
+
port: 6379,
|
|
147
|
+
prefix: 'test:',
|
|
148
|
+
$: $,
|
|
149
|
+
mock: true
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
// 测试hset和hexists
|
|
154
|
+
console.log('\n1. 测试hexists方法');
|
|
155
|
+
await redis.hset('hash1', 'field1', 'value1');
|
|
156
|
+
await redis.hset('hash1', 'field2', 'value2');
|
|
157
|
+
|
|
158
|
+
const exists1 = await redis.hexists('hash1', 'field1');
|
|
159
|
+
const exists3 = await redis.hexists('hash1', 'field3');
|
|
160
|
+
console.log('field1是否存在:', exists1); // 预期: true
|
|
161
|
+
console.log('field3是否存在:', exists3); // 预期: false
|
|
162
|
+
|
|
163
|
+
// 测试hkeys
|
|
164
|
+
console.log('\n2. 测试hkeys方法');
|
|
165
|
+
const keys = await redis.hkeys('hash1');
|
|
166
|
+
console.log('哈希字段名:', keys); // 预期: ['field1', 'field2']
|
|
167
|
+
|
|
168
|
+
// 测试hvals
|
|
169
|
+
console.log('\n3. 测试hvals方法');
|
|
170
|
+
const values = await redis.hvals('hash1');
|
|
171
|
+
console.log('哈希字段值:', values); // 预期: ['value1', 'value2']
|
|
172
|
+
|
|
173
|
+
} catch (error) {
|
|
174
|
+
console.error('哈希操作测试失败:', error);
|
|
175
|
+
} finally {
|
|
176
|
+
await redis.close();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
async function runAllTests() {
|
|
181
|
+
try {
|
|
182
|
+
await testHashOperations();
|
|
183
|
+
await testSetOperations();
|
|
184
|
+
await testSortedSetOperations();
|
|
185
|
+
console.log('\n=== 所有测试完成! ===');
|
|
186
|
+
} catch (error) {
|
|
187
|
+
console.error('测试执行失败:', error);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
runAllTests();
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
const redisModule = require('./index.js');
|
|
2
|
+
const Redis = redisModule.default || redisModule;
|
|
3
|
+
const $ = { log: { debug: console.log, error: console.error } };
|
|
4
|
+
|
|
5
|
+
async function testMGetAndMSet() {
|
|
6
|
+
console.log('=== 测试mget和mset方法兼容性修复 ===');
|
|
7
|
+
|
|
8
|
+
const redis = new Redis({
|
|
9
|
+
host: 'localhost',
|
|
10
|
+
port: 6379,
|
|
11
|
+
prefix: 'test:',
|
|
12
|
+
$: $,
|
|
13
|
+
mock: true
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
// 测试1: mset方法 - 批量设置
|
|
18
|
+
console.log('\n1. 测试mset方法 - 批量设置键值对');
|
|
19
|
+
const msetResult = await redis.mset({
|
|
20
|
+
'test_key1': 'test_value1',
|
|
21
|
+
'test_key2': 'test_value2',
|
|
22
|
+
'test_key3': { name: 'test_object' }
|
|
23
|
+
});
|
|
24
|
+
console.log('mset结果:', msetResult); // 预期: true
|
|
25
|
+
|
|
26
|
+
// 测试2: mget方法 - 批量获取
|
|
27
|
+
console.log('\n2. 测试mget方法 - 批量获取值(返回数组格式)');
|
|
28
|
+
const keysToGet = ['test_key1', 'test_key2', 'test_key3', 'non_existent_key'];
|
|
29
|
+
const mgetResult = await redis.mget(keysToGet);
|
|
30
|
+
console.log('mget结果类型:', Array.isArray(mgetResult) ? '数组(正确)' : '对象(错误)');
|
|
31
|
+
console.log('mget结果长度:', mgetResult.length); // 预期: 4
|
|
32
|
+
console.log('mget结果内容:', mgetResult);
|
|
33
|
+
|
|
34
|
+
// 验证数组索引与输入键的对应关系
|
|
35
|
+
console.log('\n3. 验证数组索引与输入键的对应关系');
|
|
36
|
+
keysToGet.forEach((key, index) => {
|
|
37
|
+
console.log(`${key} -> ${JSON.stringify(mgetResult[index])}`);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// 测试3: 单独获取验证数据是否正确设置
|
|
41
|
+
console.log('\n4. 单独获取验证数据是否正确设置');
|
|
42
|
+
const key1Value = await redis.get('test_key1');
|
|
43
|
+
const key3Value = await redis.get('test_key3');
|
|
44
|
+
console.log('test_key1值:', key1Value); // 预期: 'test_value1'
|
|
45
|
+
console.log('test_key3值类型:', typeof key3Value);
|
|
46
|
+
console.log('test_key3值内容:', key3Value);
|
|
47
|
+
|
|
48
|
+
} catch (error) {
|
|
49
|
+
console.error('测试失败:', error);
|
|
50
|
+
} finally {
|
|
51
|
+
await redis.close();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 运行测试
|
|
56
|
+
testMGetAndMSet();
|