mm_redis 1.5.0 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +83 -2
- package/index.js +50 -50
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,8 +4,8 @@ mm_redis是一个高效的Redis客户端封装库,提供了全面的Redis功
|
|
|
4
4
|
|
|
5
5
|
## 版本信息
|
|
6
6
|
|
|
7
|
-
- **当前版本**: 1.
|
|
8
|
-
- **更新日期**: 2024-
|
|
7
|
+
- **当前版本**: 1.7.0
|
|
8
|
+
- **更新日期**: 2024-10-07
|
|
9
9
|
- **作者**: 邱文武
|
|
10
10
|
|
|
11
11
|
## 功能特性
|
|
@@ -18,6 +18,7 @@ mm_redis是一个高效的Redis客户端封装库,提供了全面的Redis功
|
|
|
18
18
|
- 自动JSON序列化/反序列化
|
|
19
19
|
- 键前缀管理,支持多业务隔离
|
|
20
20
|
- 自动连接管理,无需手动维护连接状态
|
|
21
|
+
- 统一的事件系统,支持操作前后的事件监听
|
|
21
22
|
|
|
22
23
|
## 安装
|
|
23
24
|
|
|
@@ -194,6 +195,79 @@ $.log.debug(`[Redis] 消息已发布,${receivedCount}个客户端接收`);
|
|
|
194
195
|
await redis.unsubscribe('notifications');
|
|
195
196
|
```
|
|
196
197
|
|
|
198
|
+
### 事件系统
|
|
199
|
+
|
|
200
|
+
mm_redis提供了完善的事件系统,可以监听各种操作的前后事件,用于日志记录、数据修改或操作拦截。
|
|
201
|
+
|
|
202
|
+
```javascript
|
|
203
|
+
// 监听设置操作前的事件
|
|
204
|
+
redis.on('set_before', (data) => {
|
|
205
|
+
$.log.debug('[Redis] 设置缓存前:', data);
|
|
206
|
+
// 可以修改data中的值
|
|
207
|
+
// data.value = JSON.stringify(data.value);
|
|
208
|
+
// 可以通过设置data.cancel = true来取消操作
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
// 监听设置操作后的事件
|
|
212
|
+
redis.on('set_after', (data) => {
|
|
213
|
+
$.log.debug('[Redis] 设置缓存后:', data);
|
|
214
|
+
// data包含key, value, ttl, success等信息
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
// 监听设置操作的错误事件
|
|
218
|
+
redis.on('set_error', (data) => {
|
|
219
|
+
$.log.error('[Redis] 设置缓存错误:', data);
|
|
220
|
+
// data包含key, value, ttl, error等信息
|
|
221
|
+
});
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
#### 事件属性规范
|
|
225
|
+
|
|
226
|
+
所有事件都遵循统一的属性命名规范:
|
|
227
|
+
|
|
228
|
+
1. **通用属性**:
|
|
229
|
+
- `key`: 操作的键名
|
|
230
|
+
- `value`: 操作的值(替代str、fields、obj等)
|
|
231
|
+
- `ttl`: 过期时间(替代seconds)
|
|
232
|
+
- `result`: 操作结果(替代length)
|
|
233
|
+
- `success`: 操作是否成功
|
|
234
|
+
- `cancel`: 是否取消操作(仅限前置事件)
|
|
235
|
+
- `error`: 错误信息(仅限错误事件)
|
|
236
|
+
|
|
237
|
+
2. **特定属性**:
|
|
238
|
+
- `deleted`: 删除的键列表(用于del操作)
|
|
239
|
+
- `index`: 索引位置(用于setrange操作)
|
|
240
|
+
- `field`: 哈希字段名(用于hset操作)
|
|
241
|
+
|
|
242
|
+
3. **事件命名模式**:
|
|
243
|
+
- 前置事件: `${methodName}_before`
|
|
244
|
+
- 后置事件: `${methodName}_after`
|
|
245
|
+
- 错误事件: `${methodName}_error`
|
|
246
|
+
|
|
247
|
+
#### 支持的事件列表
|
|
248
|
+
|
|
249
|
+
| 操作方法 | 前置事件 | 后置事件 | 错误事件 |
|
|
250
|
+
|---------|---------|---------|--------|
|
|
251
|
+
| set | set_before | set_after | set_error |
|
|
252
|
+
| get | get_before | get_after | get_error |
|
|
253
|
+
| del | del_before | del_after | del_error |
|
|
254
|
+
| add | add_before | add_after | add_error |
|
|
255
|
+
| addInt | addInt_before | addInt_after | addInt_error |
|
|
256
|
+
| addFloat | addFloat_before | addFloat_after | addFloat_error |
|
|
257
|
+
| addStr | addStr_before | addStr_after | addStr_error |
|
|
258
|
+
| setrange | setrange_before | setrange_after | setrange_error |
|
|
259
|
+
| clear | clear_before | clear_after | clear_error |
|
|
260
|
+
| list_set | list_set_before | list_set_after | list_set_error |
|
|
261
|
+
| list_push | list_push_before | list_push_after | list_push_error |
|
|
262
|
+
| list_clear | list_clear_before | list_clear_after | list_clear_error |
|
|
263
|
+
| mset | mset_before | mset_after | mset_error |
|
|
264
|
+
| mget | mget_before | mget_after | mget_error |
|
|
265
|
+
| hset | hset_before | hset_after | hset_error |
|
|
266
|
+
| hmset | hmset_before | hmset_after | hmset_error |
|
|
267
|
+
| hdel | hdel_before | hdel_after | hdel_error |
|
|
268
|
+
| hget | hget_before | hget_after | hget_error |
|
|
269
|
+
| hgetall | hgetall_before | hgetall_after | hgetall_error |
|
|
270
|
+
|
|
197
271
|
## API文档
|
|
198
272
|
|
|
199
273
|
### 连接管理
|
|
@@ -278,9 +352,16 @@ await redis.unsubscribe('notifications');
|
|
|
278
352
|
3. **合理设置过期时间**: 避免Redis中数据无限增长
|
|
279
353
|
4. **使用键前缀**: 通过键前缀进行业务隔离,避免键冲突
|
|
280
354
|
5. **及时关闭连接**: 在应用结束时调用close()方法关闭所有连接
|
|
355
|
+
6. **利用事件系统**: 使用事件系统进行日志记录、数据验证和操作拦截
|
|
281
356
|
|
|
282
357
|
## 版本更新
|
|
283
358
|
|
|
359
|
+
### 1.7.0 (2024-10-07)
|
|
360
|
+
- 统一事件系统的属性命名规范
|
|
361
|
+
- 更新所有方法的事件emit属性,使用统一的key、value、ttl、result等命名
|
|
362
|
+
- 增加事件系统的详细文档
|
|
363
|
+
- 修复部分方法中的拼写错误
|
|
364
|
+
|
|
284
365
|
### 1.6.0 (2024-01-10)
|
|
285
366
|
- 添加完整的连接池管理功能
|
|
286
367
|
- 新增Pipeline批量操作优化
|
package/index.js
CHANGED
|
@@ -479,7 +479,7 @@ Redis.prototype.ttl = async function(key, seconds) {
|
|
|
479
479
|
Redis.prototype.addInt = async function(key, num) {
|
|
480
480
|
try {
|
|
481
481
|
// 触发前置事件,允许修改或阻止操作
|
|
482
|
-
const beforeEventData = { key, num, cancel: false };
|
|
482
|
+
const beforeEventData = { key, value: num, cancel: false };
|
|
483
483
|
this.emit('addInt_before', beforeEventData);
|
|
484
484
|
|
|
485
485
|
// 如果事件处理器标记为取消,则返回false
|
|
@@ -489,7 +489,7 @@ Redis.prototype.addInt = async function(key, num) {
|
|
|
489
489
|
}
|
|
490
490
|
|
|
491
491
|
// 使用可能被修改的值
|
|
492
|
-
let { key: finalKey,
|
|
492
|
+
let { key: finalKey, value: finalNum } = beforeEventData;
|
|
493
493
|
|
|
494
494
|
const connection = await this._getConnection();
|
|
495
495
|
try {
|
|
@@ -534,14 +534,14 @@ Redis.prototype.addInt = async function(key, num) {
|
|
|
534
534
|
}
|
|
535
535
|
|
|
536
536
|
// 触发后置事件
|
|
537
|
-
this.emit('addInt_after', { key: finalKey,
|
|
537
|
+
this.emit('addInt_after', { key: finalKey, value: finalNum, result, success: true });
|
|
538
538
|
return result;
|
|
539
539
|
} finally {
|
|
540
540
|
this._recycleConnection(connection);
|
|
541
541
|
}
|
|
542
542
|
} catch (err) {
|
|
543
543
|
// 触发错误事件
|
|
544
|
-
this.emit('addInt_error', { key, num, error: err });
|
|
544
|
+
this.emit('addInt_error', { key, value: num, error: err });
|
|
545
545
|
$.log.error(`[Redis] 增加整数值失败 [${key}]:`, err);
|
|
546
546
|
throw err;
|
|
547
547
|
}
|
|
@@ -556,7 +556,7 @@ Redis.prototype.addInt = async function(key, num) {
|
|
|
556
556
|
Redis.prototype.addFloat = async function(key, num) {
|
|
557
557
|
try {
|
|
558
558
|
// 触发前置事件,允许修改或阻止操作
|
|
559
|
-
const beforeEventData = { key, num, cancel: false };
|
|
559
|
+
const beforeEventData = { key, value: num, cancel: false };
|
|
560
560
|
this.emit('addFloat_before', beforeEventData);
|
|
561
561
|
|
|
562
562
|
// 如果事件处理器标记为取消,则抛出错误
|
|
@@ -566,7 +566,7 @@ Redis.prototype.addFloat = async function(key, num) {
|
|
|
566
566
|
}
|
|
567
567
|
|
|
568
568
|
// 使用可能被修改的值
|
|
569
|
-
let { key: finalKey,
|
|
569
|
+
let { key: finalKey, value: finalNum } = beforeEventData;
|
|
570
570
|
let result;
|
|
571
571
|
|
|
572
572
|
const connection = await this._getConnection();
|
|
@@ -595,7 +595,7 @@ Redis.prototype.addFloat = async function(key, num) {
|
|
|
595
595
|
}
|
|
596
596
|
|
|
597
597
|
// 触发后置事件
|
|
598
|
-
this.emit('addFloat_after', { key: finalKey,
|
|
598
|
+
this.emit('addFloat_after', { key: finalKey, value: finalNum, result, success: true });
|
|
599
599
|
return result;
|
|
600
600
|
} catch (err) {
|
|
601
601
|
// 如果出错,回退到先获取再设置的方式
|
|
@@ -609,14 +609,14 @@ Redis.prototype.addFloat = async function(key, num) {
|
|
|
609
609
|
await this.set(finalKey, n);
|
|
610
610
|
|
|
611
611
|
// 触发后置事件
|
|
612
|
-
this.emit('addFloat_after', { key: finalKey,
|
|
612
|
+
this.emit('addFloat_after', { key: finalKey, value: finalNum, result: n, success: true });
|
|
613
613
|
return n;
|
|
614
614
|
} finally {
|
|
615
615
|
this._recycleConnection(connection);
|
|
616
616
|
}
|
|
617
617
|
} catch (err) {
|
|
618
618
|
// 触发错误事件
|
|
619
|
-
this.emit('addFloat_error', { key, num, error: err });
|
|
619
|
+
this.emit('addFloat_error', { key, value: num, error: err });
|
|
620
620
|
$.log.error(`[Redis] 增加浮点数值失败 [${key}]:`, err);
|
|
621
621
|
throw err;
|
|
622
622
|
}
|
|
@@ -631,7 +631,7 @@ Redis.prototype.addFloat = async function(key, num) {
|
|
|
631
631
|
Redis.prototype.addStr = async function(key, str) {
|
|
632
632
|
try {
|
|
633
633
|
// 触发前置事件,允许修改或阻止操作
|
|
634
|
-
const beforeEventData = { key, str, cancel: false };
|
|
634
|
+
const beforeEventData = { key, value: str, cancel: false };
|
|
635
635
|
this.emit('addStr_before', beforeEventData);
|
|
636
636
|
|
|
637
637
|
// 如果事件处理器标记为取消,则返回0
|
|
@@ -641,7 +641,7 @@ Redis.prototype.addStr = async function(key, str) {
|
|
|
641
641
|
}
|
|
642
642
|
|
|
643
643
|
// 使用可能被修改的值
|
|
644
|
-
let { key: finalKey,
|
|
644
|
+
let { key: finalKey, value: finalStr } = beforeEventData;
|
|
645
645
|
let result;
|
|
646
646
|
|
|
647
647
|
const connection = await this._getConnection();
|
|
@@ -666,7 +666,7 @@ Redis.prototype.addStr = async function(key, str) {
|
|
|
666
666
|
}
|
|
667
667
|
|
|
668
668
|
// 触发后置事件
|
|
669
|
-
this.emit('addStr_after', { key: finalKey,
|
|
669
|
+
this.emit('addStr_after', { key: finalKey, value: finalStr, result, success: true });
|
|
670
670
|
return result;
|
|
671
671
|
} catch (err) {
|
|
672
672
|
$.log.error('[Redis] 追加字符串失败:', err);
|
|
@@ -676,14 +676,14 @@ Redis.prototype.addStr = async function(key, str) {
|
|
|
676
676
|
await this.set(finalKey, value);
|
|
677
677
|
|
|
678
678
|
// 触发后置事件
|
|
679
|
-
this.emit('addStr_after', { key: finalKey,
|
|
679
|
+
this.emit('addStr_after', { key: finalKey, value: finalStr, result: value.length, success: true });
|
|
680
680
|
return value.length;
|
|
681
681
|
} finally {
|
|
682
682
|
this._recycleConnection(connection);
|
|
683
683
|
}
|
|
684
684
|
} catch (err) {
|
|
685
685
|
// 触发错误事件
|
|
686
|
-
this.emit('addStr_error', { key, str, error: err });
|
|
686
|
+
this.emit('addStr_error', { key, value: str, error: err });
|
|
687
687
|
$.log.error(`[Redis] 追加字符串失败 [${key}]:`, err);
|
|
688
688
|
return 0;
|
|
689
689
|
}
|
|
@@ -715,25 +715,25 @@ Redis.prototype.del = async function(key) {
|
|
|
715
715
|
if (Array.isArray(finalKey)) {
|
|
716
716
|
// 批量删除 - 分别删除每个键以确保正确处理
|
|
717
717
|
success = true;
|
|
718
|
-
const
|
|
718
|
+
const deleted = [];
|
|
719
719
|
for (const k of finalKey) {
|
|
720
720
|
const prefixedKey = this.applyPrefix(k);
|
|
721
721
|
const result = await connection.del(prefixedKey);
|
|
722
722
|
if (result !== 1) {
|
|
723
723
|
success = false;
|
|
724
724
|
} else {
|
|
725
|
-
|
|
725
|
+
deleted.push(k);
|
|
726
726
|
}
|
|
727
727
|
}
|
|
728
728
|
// 触发后置事件
|
|
729
|
-
this.emit('del_after', { key: finalKey, success,
|
|
729
|
+
this.emit('del_after', { key: finalKey, success, deleted });
|
|
730
730
|
} else {
|
|
731
731
|
// 单个删除
|
|
732
732
|
const prefixedKey = this.applyPrefix(finalKey);
|
|
733
733
|
const n = await connection.del(prefixedKey);
|
|
734
734
|
success = n === 1;
|
|
735
735
|
// 触发后置事件
|
|
736
|
-
this.emit('del_after', { key: finalKey, success,
|
|
736
|
+
this.emit('del_after', { key: finalKey, success, deleted: success ? [finalKey] : [] });
|
|
737
737
|
}
|
|
738
738
|
return success;
|
|
739
739
|
} finally {
|
|
@@ -757,7 +757,7 @@ Redis.prototype.del = async function(key) {
|
|
|
757
757
|
Redis.prototype.set = async function(key, value, seconds) {
|
|
758
758
|
try {
|
|
759
759
|
// 触发前置事件,允许修改或阻止操作
|
|
760
|
-
const beforeEventData = { key, value, seconds, cancel: false };
|
|
760
|
+
const beforeEventData = { key, value, ttl: seconds, cancel: false };
|
|
761
761
|
this.emit('set_before', beforeEventData);
|
|
762
762
|
|
|
763
763
|
// 如果事件处理器标记为取消,则返回false
|
|
@@ -767,7 +767,7 @@ Redis.prototype.set = async function(key, value, seconds) {
|
|
|
767
767
|
}
|
|
768
768
|
|
|
769
769
|
// 使用可能被修改的值
|
|
770
|
-
let { key: finalKey, value: finalValue,
|
|
770
|
+
let { key: finalKey, value: finalValue, ttl: finalSeconds } = beforeEventData;
|
|
771
771
|
|
|
772
772
|
const connection = await this._getConnection();
|
|
773
773
|
try {
|
|
@@ -785,7 +785,7 @@ Redis.prototype.set = async function(key, value, seconds) {
|
|
|
785
785
|
}
|
|
786
786
|
|
|
787
787
|
// 触发后置事件
|
|
788
|
-
this.emit('set_after', { key, value, seconds, success: true });
|
|
788
|
+
this.emit('set_after', { key, value, ttl: seconds, success: true });
|
|
789
789
|
return true;
|
|
790
790
|
} finally {
|
|
791
791
|
this._recycleConnection(connection);
|
|
@@ -793,7 +793,7 @@ Redis.prototype.set = async function(key, value, seconds) {
|
|
|
793
793
|
} catch (err) {
|
|
794
794
|
$.log.error(`[Redis] 设置缓存失败 [${key}]:`, err);
|
|
795
795
|
// 触发错误事件
|
|
796
|
-
this.emit('set_error', { key, value,
|
|
796
|
+
this.emit('set_error', { key, value, error: err });
|
|
797
797
|
return false;
|
|
798
798
|
}
|
|
799
799
|
};
|
|
@@ -808,7 +808,7 @@ Redis.prototype.set = async function(key, value, seconds) {
|
|
|
808
808
|
Redis.prototype.add = async function(key, value, seconds) {
|
|
809
809
|
try {
|
|
810
810
|
// 触发前置事件,允许修改或阻止操作
|
|
811
|
-
const beforeEventData = { key, value, seconds, cancel: false };
|
|
811
|
+
const beforeEventData = { key, value, ttl: seconds, cancel: false };
|
|
812
812
|
this.emit('add_before', beforeEventData);
|
|
813
813
|
|
|
814
814
|
// 如果事件处理器标记为取消,则返回false
|
|
@@ -818,7 +818,7 @@ Redis.prototype.add = async function(key, value, seconds) {
|
|
|
818
818
|
}
|
|
819
819
|
|
|
820
820
|
// 使用可能被修改的值
|
|
821
|
-
let { key: finalKey, value: finalValue,
|
|
821
|
+
let { key: finalKey, value: finalValue, ttl: finalSeconds } = beforeEventData;
|
|
822
822
|
|
|
823
823
|
const connection = await this._getConnection();
|
|
824
824
|
try {
|
|
@@ -832,7 +832,7 @@ Redis.prototype.add = async function(key, value, seconds) {
|
|
|
832
832
|
const success = result === "OK";
|
|
833
833
|
|
|
834
834
|
// 触发后置事件
|
|
835
|
-
this.emit('add_after', { key, value,
|
|
835
|
+
this.emit('add_after', { key: finalKey, value: finalValue, ttl: finalSeconds, success });
|
|
836
836
|
return success;
|
|
837
837
|
} finally {
|
|
838
838
|
this._recycleConnection(connection);
|
|
@@ -840,7 +840,7 @@ Redis.prototype.add = async function(key, value, seconds) {
|
|
|
840
840
|
} catch (err) {
|
|
841
841
|
$.log.error(`[Redis] 添加缓存失败 [${key}]:`, err);
|
|
842
842
|
// 触发错误事件
|
|
843
|
-
this.emit('add_error', { key, value, seconds, error: err });
|
|
843
|
+
this.emit('add_error', { key, value, ttl: seconds, error: err });
|
|
844
844
|
return false;
|
|
845
845
|
}
|
|
846
846
|
};
|
|
@@ -988,7 +988,7 @@ Redis.prototype.setrange = async function(key, index, value) {
|
|
|
988
988
|
}
|
|
989
989
|
|
|
990
990
|
// 触发后置事件
|
|
991
|
-
this.emit('setrange_after', { key: finalKey, index: finalIndex, value: finalValue,
|
|
991
|
+
this.emit('setrange_after', { key: finalKey, index: finalIndex, value: finalValue, result, success: true });
|
|
992
992
|
return result;
|
|
993
993
|
} catch (err) {
|
|
994
994
|
$.log.error('[Redis] 设置字符串范围失败:', err);
|
|
@@ -1002,7 +1002,7 @@ Redis.prototype.setrange = async function(key, index, value) {
|
|
|
1002
1002
|
await this.set(finalKey, str);
|
|
1003
1003
|
|
|
1004
1004
|
// 触发后置事件
|
|
1005
|
-
this.emit('setrange_after', { key: finalKey, index: finalIndex, value: finalValue,
|
|
1005
|
+
this.emit('setrange_after', { key: finalKey, index: finalIndex, value: finalValue, result: str.length, success: true });
|
|
1006
1006
|
return str.length;
|
|
1007
1007
|
} finally {
|
|
1008
1008
|
this._recycleConnection(connection);
|
|
@@ -1160,7 +1160,7 @@ Redis.prototype.keys = async function(pattern = '*') {
|
|
|
1160
1160
|
Redis.prototype.list_set = async function(key, value, seconds) {
|
|
1161
1161
|
try {
|
|
1162
1162
|
// 触发前置事件,允许修改或阻止操作
|
|
1163
|
-
const beforeEventData = { key, value, seconds, cancel: false };
|
|
1163
|
+
const beforeEventData = { key, value, ttl: seconds, cancel: false };
|
|
1164
1164
|
this.emit('list_set_before', beforeEventData);
|
|
1165
1165
|
|
|
1166
1166
|
// 如果事件处理器标记为取消,则返回0
|
|
@@ -1170,7 +1170,7 @@ Redis.prototype.list_set = async function(key, value, seconds) {
|
|
|
1170
1170
|
}
|
|
1171
1171
|
|
|
1172
1172
|
// 使用可能被修改的值
|
|
1173
|
-
let { key: finalKey, value: finalValue,
|
|
1173
|
+
let { key: finalKey, value: finalValue, ttl: finalSeconds } = beforeEventData;
|
|
1174
1174
|
let len = 0;
|
|
1175
1175
|
|
|
1176
1176
|
const connection = await this._getConnection();
|
|
@@ -1218,14 +1218,14 @@ Redis.prototype.list_set = async function(key, value, seconds) {
|
|
|
1218
1218
|
}
|
|
1219
1219
|
|
|
1220
1220
|
// 触发后置事件
|
|
1221
|
-
this.emit('list_set_after', { key: finalKey, value: finalValue,
|
|
1221
|
+
this.emit('list_set_after', { key: finalKey, value: finalValue, ttl: finalSeconds, result: len, success: len > 0 });
|
|
1222
1222
|
return len;
|
|
1223
1223
|
} finally {
|
|
1224
1224
|
this._recycleConnection(connection);
|
|
1225
1225
|
}
|
|
1226
1226
|
} catch (err) {
|
|
1227
1227
|
// 触发错误事件
|
|
1228
|
-
this.emit('list_set_error', { key, value,
|
|
1228
|
+
this.emit('list_set_error', { key, value, error: err });
|
|
1229
1229
|
$.log.error(`[Redis] 设置列表失败 [${key}]:`, err);
|
|
1230
1230
|
return 0;
|
|
1231
1231
|
}
|
|
@@ -1283,7 +1283,7 @@ Redis.prototype.list_push = async function(key, value) {
|
|
|
1283
1283
|
}
|
|
1284
1284
|
|
|
1285
1285
|
// 触发后置事件
|
|
1286
|
-
this.emit('list_push_after', { key: finalKey, value: finalValue,
|
|
1286
|
+
this.emit('list_push_after', { key: finalKey, value: finalValue, result: len, success });
|
|
1287
1287
|
return len;
|
|
1288
1288
|
} finally {
|
|
1289
1289
|
this._recycleConnection(connection);
|
|
@@ -1512,7 +1512,7 @@ Redis.prototype.mget = async function(keys) {
|
|
|
1512
1512
|
Redis.prototype.mset = async function(obj, seconds) {
|
|
1513
1513
|
try {
|
|
1514
1514
|
// 触发前置事件,允许修改或阻止操作
|
|
1515
|
-
const beforeEventData = {
|
|
1515
|
+
const beforeEventData = { value: obj, ttl: seconds, cancel: false };
|
|
1516
1516
|
this.emit('mset_before', beforeEventData);
|
|
1517
1517
|
|
|
1518
1518
|
// 如果事件处理器标记为取消,则返回false
|
|
@@ -1522,11 +1522,11 @@ Redis.prototype.mset = async function(obj, seconds) {
|
|
|
1522
1522
|
}
|
|
1523
1523
|
|
|
1524
1524
|
// 使用可能被修改的值
|
|
1525
|
-
let {
|
|
1525
|
+
let { value: finalData, ttl: finalSeconds } = beforeEventData;
|
|
1526
1526
|
|
|
1527
1527
|
// 检查最终数据是否有效
|
|
1528
1528
|
if (!finalData || typeof finalData !== 'object') {
|
|
1529
|
-
throw new Error('事件处理后的
|
|
1529
|
+
throw new Error('事件处理后的value必须是非空对象');
|
|
1530
1530
|
}
|
|
1531
1531
|
|
|
1532
1532
|
// 使用Pipeline优化批量操作
|
|
@@ -1545,11 +1545,11 @@ Redis.prototype.mset = async function(obj, seconds) {
|
|
|
1545
1545
|
await pipeline.exec();
|
|
1546
1546
|
|
|
1547
1547
|
// 触发后置事件
|
|
1548
|
-
this.emit('mset_after', {
|
|
1548
|
+
this.emit('mset_after', { value: finalData, ttl: finalSeconds, success: true });
|
|
1549
1549
|
return true;
|
|
1550
1550
|
} catch (err) {
|
|
1551
1551
|
// 触发错误事件
|
|
1552
|
-
this.emit('mset_error', {
|
|
1552
|
+
this.emit('mset_error', { value: obj, ttl: seconds, error: err });
|
|
1553
1553
|
|
|
1554
1554
|
// 如果Pipeline失败,回退到原实现
|
|
1555
1555
|
$.log.warn('[Redis] 使用Pipeline批量设置失败,使用回退方案:', err);
|
|
@@ -1571,11 +1571,11 @@ Redis.prototype.mset = async function(obj, seconds) {
|
|
|
1571
1571
|
}
|
|
1572
1572
|
|
|
1573
1573
|
// 触发后置事件(使用原始数据,因为前置数据修改处理已失败)
|
|
1574
|
-
this.emit('mset_after', {
|
|
1574
|
+
this.emit('mset_after', { value: obj, ttl: seconds, success: true });
|
|
1575
1575
|
return true;
|
|
1576
1576
|
} catch (fallbackErr) {
|
|
1577
1577
|
// 触发错误事件
|
|
1578
|
-
this.emit('mset_error', {
|
|
1578
|
+
this.emit('mset_error', { value: obj, ttl: seconds, error: fallbackErr });
|
|
1579
1579
|
$.log.error('[Redis] 回退方案批量设置也失败:', fallbackErr);
|
|
1580
1580
|
return false;
|
|
1581
1581
|
} finally {
|
|
@@ -1666,7 +1666,7 @@ Redis.prototype.hvals = async function(key) {
|
|
|
1666
1666
|
Redis.prototype.hdel = async function(key, fields) {
|
|
1667
1667
|
try {
|
|
1668
1668
|
// 触发前置事件,允许修改或阻止操作
|
|
1669
|
-
const beforeEventData = { key, fields, cancel: false };
|
|
1669
|
+
const beforeEventData = { key, value: fields, cancel: false };
|
|
1670
1670
|
this.emit('hdel_before', beforeEventData);
|
|
1671
1671
|
|
|
1672
1672
|
// 如果事件处理器标记为取消,则返回false
|
|
@@ -1676,7 +1676,7 @@ Redis.prototype.hdel = async function(key, fields) {
|
|
|
1676
1676
|
}
|
|
1677
1677
|
|
|
1678
1678
|
// 使用可能被修改的值
|
|
1679
|
-
let { key: finalKey,
|
|
1679
|
+
let { key: finalKey, value: finalFields } = beforeEventData;
|
|
1680
1680
|
let success = true;
|
|
1681
1681
|
|
|
1682
1682
|
const connection = await this._getConnection();
|
|
@@ -1697,14 +1697,14 @@ Redis.prototype.hdel = async function(key, fields) {
|
|
|
1697
1697
|
}
|
|
1698
1698
|
|
|
1699
1699
|
// 触发后置事件
|
|
1700
|
-
this.emit('hdel_after', { key: finalKey,
|
|
1700
|
+
this.emit('hdel_after', { key: finalKey, value: finalFields, success });
|
|
1701
1701
|
return success;
|
|
1702
1702
|
} finally {
|
|
1703
1703
|
this._recycleConnection(connection);
|
|
1704
1704
|
}
|
|
1705
1705
|
} catch (err) {
|
|
1706
1706
|
// 触发错误事件
|
|
1707
|
-
this.emit('hdel_error', { key, fields, error: err });
|
|
1707
|
+
this.emit('hdel_error', { key, value: fields, error: err });
|
|
1708
1708
|
$.log.error(`[Redis] 删除哈希字段失败 [${key}]:`, err);
|
|
1709
1709
|
return false;
|
|
1710
1710
|
}
|
|
@@ -2146,7 +2146,7 @@ Redis.prototype.hset = async function(key, field, value) {
|
|
|
2146
2146
|
await connection.execute('hset', finalKey, finalField, finalValue);
|
|
2147
2147
|
|
|
2148
2148
|
// 触发后置事件
|
|
2149
|
-
this.emit('hset_after', { key, field, value, success: true });
|
|
2149
|
+
this.emit('hset_after', { key: finalKey, field: finalField, value: finalValue, success: true });
|
|
2150
2150
|
return true;
|
|
2151
2151
|
} finally {
|
|
2152
2152
|
this._recycleConnection(connection);
|
|
@@ -2203,7 +2203,7 @@ Redis.prototype.hget = async function(key, field) {
|
|
|
2203
2203
|
Redis.prototype.hmset = async function(key, obj) {
|
|
2204
2204
|
try {
|
|
2205
2205
|
// 触发前置事件,允许修改或阻止操作
|
|
2206
|
-
const beforeEventData = { key, obj, cancel: false };
|
|
2206
|
+
const beforeEventData = { key, value: obj, cancel: false };
|
|
2207
2207
|
this.emit('hmset_before', beforeEventData);
|
|
2208
2208
|
|
|
2209
2209
|
// 如果事件处理器标记为取消,则返回false
|
|
@@ -2213,7 +2213,7 @@ Redis.prototype.hmset = async function(key, obj) {
|
|
|
2213
2213
|
}
|
|
2214
2214
|
|
|
2215
2215
|
// 使用可能被修改的值
|
|
2216
|
-
let { key: finalKey,
|
|
2216
|
+
let { key: finalKey, value: finalObj } = beforeEventData;
|
|
2217
2217
|
|
|
2218
2218
|
const connection = await this._getConnection();
|
|
2219
2219
|
try {
|
|
@@ -2232,15 +2232,15 @@ Redis.prototype.hmset = async function(key, obj) {
|
|
|
2232
2232
|
}
|
|
2233
2233
|
|
|
2234
2234
|
// 触发后置事件
|
|
2235
|
-
this.emit('hmset_after', { key,
|
|
2235
|
+
this.emit('hmset_after', { key: finalKey, value: finalObj, success: true });
|
|
2236
2236
|
return true;
|
|
2237
2237
|
} finally {
|
|
2238
|
-
this.
|
|
2238
|
+
this._recycleConnection(connection);
|
|
2239
2239
|
}
|
|
2240
2240
|
} catch (err) {
|
|
2241
2241
|
$.log.error(`[Redis] 批量设置哈希字段失败 [${key}]:`, err);
|
|
2242
2242
|
// 触发错误事件
|
|
2243
|
-
this.emit('hmset_error', { key, obj, error: err });
|
|
2243
|
+
this.emit('hmset_error', { key, value: obj, error: err });
|
|
2244
2244
|
return false;
|
|
2245
2245
|
}
|
|
2246
2246
|
};
|