@nest-omni/core 4.1.3-1 → 4.1.3-10
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/audit/audit.module.d.ts +10 -0
- package/audit/audit.module.js +15 -0
- package/audit/controllers/audit.controller.d.ts +24 -0
- package/audit/controllers/audit.controller.js +24 -0
- package/audit/decorators/audit-controller.decorator.d.ts +8 -0
- package/audit/decorators/audit-controller.decorator.js +9 -0
- package/audit/decorators/audit-operation.decorator.d.ts +45 -0
- package/audit/decorators/audit-operation.decorator.js +49 -0
- package/audit/decorators/entity-audit.decorator.d.ts +8 -0
- package/audit/decorators/entity-audit.decorator.js +9 -0
- package/audit/dto/audit-log-query.dto.d.ts +3 -0
- package/audit/dto/audit-log-query.dto.js +3 -0
- package/audit/dto/begin-transaction.dto.d.ts +3 -0
- package/audit/dto/begin-transaction.dto.js +3 -0
- package/audit/dto/compare-entities.dto.d.ts +3 -0
- package/audit/dto/compare-entities.dto.js +3 -0
- package/audit/dto/pre-check-restore.dto.d.ts +3 -0
- package/audit/dto/pre-check-restore.dto.js +3 -0
- package/audit/dto/restore-entity.dto.d.ts +3 -0
- package/audit/dto/restore-entity.dto.js +3 -0
- package/audit/entities/entity-audit-log.entity.d.ts +3 -0
- package/audit/entities/entity-audit-log.entity.js +3 -0
- package/audit/entities/entity-transaction.entity.d.ts +3 -0
- package/audit/entities/entity-transaction.entity.js +3 -0
- package/audit/entities/manual-operation-log.entity.d.ts +4 -0
- package/audit/entities/manual-operation-log.entity.js +4 -0
- package/audit/entities/operation-template.entity.d.ts +4 -0
- package/audit/entities/operation-template.entity.js +4 -0
- package/audit/enums/audit.enums.d.ts +17 -2
- package/audit/enums/audit.enums.js +15 -0
- package/audit/index.js +10 -0
- package/audit/interceptors/audit.interceptor.d.ts +15 -0
- package/audit/interceptors/audit.interceptor.js +23 -1
- package/audit/interfaces/audit.interfaces.d.ts +42 -0
- package/audit/services/audit-context.service.d.ts +15 -0
- package/audit/services/audit-context.service.js +15 -0
- package/audit/services/audit-strategy.service.d.ts +6 -0
- package/audit/services/audit-strategy.service.js +13 -0
- package/audit/services/entity-audit.service.d.ts +57 -0
- package/audit/services/entity-audit.service.js +91 -0
- package/audit/services/manual-audit-log.service.d.ts +124 -0
- package/audit/services/manual-audit-log.service.js +138 -0
- package/audit/services/multi-database.service.d.ts +12 -0
- package/audit/services/multi-database.service.js +12 -0
- package/audit/services/operation-description.service.d.ts +59 -0
- package/audit/services/operation-description.service.js +76 -2
- package/audit/services/transaction-audit.service.d.ts +30 -0
- package/audit/services/transaction-audit.service.js +47 -0
- package/audit/subscribers/entity-audit.subscriber.d.ts +15 -0
- package/audit/subscribers/entity-audit.subscriber.js +29 -1
- package/cache/cache-metrics.service.d.ts +67 -0
- package/cache/cache-metrics.service.js +68 -4
- package/cache/cache-serialization.service.d.ts +31 -0
- package/cache/cache-serialization.service.js +25 -0
- package/cache/cache.constants.d.ts +9 -0
- package/cache/cache.constants.js +9 -0
- package/cache/cache.health.d.ts +26 -0
- package/cache/cache.health.js +30 -0
- package/cache/cache.module.d.ts +86 -0
- package/cache/cache.module.js +71 -0
- package/cache/cache.service.d.ts +140 -0
- package/cache/cache.service.js +157 -0
- package/cache/cache.warmup.service.d.ts +39 -0
- package/cache/cache.warmup.service.js +32 -0
- package/cache/decorators/cache-evict.decorator.d.ts +47 -0
- package/cache/decorators/cache-evict.decorator.js +56 -0
- package/cache/decorators/cache-put.decorator.d.ts +34 -0
- package/cache/decorators/cache-put.decorator.js +39 -0
- package/cache/decorators/cacheable.decorator.d.ts +40 -0
- package/cache/decorators/cacheable.decorator.js +55 -0
- package/cache/dependencies/callback.dependency.d.ts +33 -0
- package/cache/dependencies/callback.dependency.js +39 -1
- package/cache/dependencies/chain.dependency.d.ts +28 -0
- package/cache/dependencies/chain.dependency.js +34 -0
- package/cache/dependencies/db.dependency.d.ts +45 -0
- package/cache/dependencies/db.dependency.js +48 -1
- package/cache/dependencies/file.dependency.d.ts +32 -0
- package/cache/dependencies/file.dependency.js +34 -0
- package/cache/dependencies/tag.dependency.d.ts +36 -0
- package/cache/dependencies/tag.dependency.js +36 -0
- package/cache/dependencies/time.dependency.d.ts +43 -0
- package/cache/dependencies/time.dependency.js +43 -0
- package/cache/examples/basic-usage.d.ts +15 -0
- package/cache/examples/basic-usage.js +62 -8
- package/cache/index.js +9 -0
- package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
- package/cache/interfaces/cache-options.interface.d.ts +81 -0
- package/cache/interfaces/cache-options.interface.js +6 -0
- package/cache/interfaces/cache-provider.interface.d.ts +78 -0
- package/cache/providers/base-cache.provider.d.ts +14 -0
- package/cache/providers/base-cache.provider.js +16 -0
- package/cache/providers/cls-cache.provider.d.ts +20 -0
- package/cache/providers/cls-cache.provider.js +28 -0
- package/cache/providers/memory-cache.provider.d.ts +23 -0
- package/cache/providers/memory-cache.provider.js +26 -0
- package/cache/providers/redis-cache.provider.d.ts +26 -0
- package/cache/providers/redis-cache.provider.js +29 -0
- package/cache/utils/dependency-manager.util.d.ts +52 -0
- package/cache/utils/dependency-manager.util.js +59 -0
- package/cache/utils/key-generator.util.d.ts +42 -0
- package/cache/utils/key-generator.util.js +53 -1
- package/common/abstract.entity.d.ts +14 -0
- package/common/abstract.entity.js +14 -0
- package/common/boilerplate.polyfill.d.ts +142 -4
- package/common/boilerplate.polyfill.js +24 -100
- package/common/dto/dto-container.d.ts +16 -0
- package/common/dto/dto-container.js +20 -0
- package/common/dto/dto-decorators.d.ts +18 -0
- package/common/dto/dto-decorators.js +14 -0
- package/common/dto/dto-extensions.d.ts +11 -0
- package/common/dto/dto-extensions.js +9 -0
- package/common/dto/dto-service-accessor.d.ts +17 -0
- package/common/dto/dto-service-accessor.js +18 -0
- package/common/dto/dto-transformer.d.ts +12 -0
- package/common/dto/dto-transformer.js +9 -0
- package/common/dto/index.js +2 -0
- package/common/examples/paginate-and-map.example.d.ts +6 -0
- package/common/examples/paginate-and-map.example.js +26 -0
- package/common/utils.d.ts +15 -0
- package/common/utils.js +15 -0
- package/constants/language-code.js +1 -0
- package/decorators/field.decorators.js +8 -1
- package/decorators/property.decorators.js +1 -0
- package/decorators/public-route.decorator.js +1 -0
- package/decorators/transform.decorators.d.ts +27 -0
- package/decorators/transform.decorators.js +29 -0
- package/decorators/translate.decorator.js +1 -0
- package/decorators/user.decorator.js +1 -0
- package/decorators/validator.decorators.d.ts +8 -18
- package/decorators/validator.decorators.js +22 -190
- package/filters/constraint-errors.js +1 -0
- package/helpers/common.helper.d.ts +13 -0
- package/helpers/common.helper.js +13 -0
- package/http-client/config/http-client.config.d.ts +15 -0
- package/http-client/config/http-client.config.js +25 -9
- package/http-client/decorators/http-client.decorators.d.ts +63 -0
- package/http-client/decorators/http-client.decorators.js +71 -3
- package/http-client/entities/http-log.entity.d.ts +229 -0
- package/http-client/entities/http-log.entity.js +6 -1
- package/http-client/errors/http-client.errors.d.ts +57 -0
- package/http-client/errors/http-client.errors.js +58 -0
- package/http-client/examples/advanced-usage.example.d.ts +41 -0
- package/http-client/examples/advanced-usage.example.js +68 -24
- package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
- package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
- package/http-client/examples/basic-usage.example.d.ts +60 -0
- package/http-client/examples/basic-usage.example.js +60 -0
- package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
- package/http-client/examples/multi-api-configuration.example.js +76 -5
- package/http-client/http-client.module.d.ts +13 -0
- package/http-client/http-client.module.js +19 -0
- package/http-client/index.js +8 -0
- package/http-client/interfaces/api-client-config.interface.d.ts +125 -0
- package/http-client/interfaces/api-client-config.interface.js +3 -0
- package/http-client/interfaces/http-client-config.interface.d.ts +60 -0
- package/http-client/services/api-client-registry.service.d.ts +57 -0
- package/http-client/services/api-client-registry.service.js +84 -1
- package/http-client/services/cache.service.d.ts +52 -0
- package/http-client/services/cache.service.js +72 -3
- package/http-client/services/circuit-breaker.service.d.ts +46 -0
- package/http-client/services/circuit-breaker.service.js +52 -0
- package/http-client/services/http-client.service.d.ts +67 -0
- package/http-client/services/http-client.service.js +105 -4
- package/http-client/services/http-log-query.service.d.ts +83 -0
- package/http-client/services/http-log-query.service.js +122 -1
- package/http-client/services/http-replay.service.d.ts +101 -0
- package/http-client/services/http-replay.service.js +86 -0
- package/http-client/services/log-cleanup.service.d.ts +63 -0
- package/http-client/services/log-cleanup.service.js +54 -2
- package/http-client/services/logging.service.d.ts +40 -0
- package/http-client/services/logging.service.js +53 -0
- package/http-client/utils/call-stack-extractor.util.d.ts +37 -0
- package/http-client/utils/call-stack-extractor.util.js +48 -0
- package/http-client/utils/context-extractor.util.d.ts +49 -0
- package/http-client/utils/context-extractor.util.js +52 -0
- package/http-client/utils/curl-generator.util.d.ts +21 -0
- package/http-client/utils/curl-generator.util.js +44 -3
- package/http-client/utils/request-id.util.d.ts +18 -0
- package/http-client/utils/request-id.util.js +20 -0
- package/http-client/utils/retry-recorder.util.d.ts +42 -0
- package/http-client/utils/retry-recorder.util.js +44 -0
- package/i18n/en_US/validation.json +2 -1
- package/i18n/zh_CN/validation.json +2 -1
- package/index.js +8 -0
- package/interceptors/translation-interceptor.service.js +5 -0
- package/package.json +1 -1
- package/providers/context.provider.js +2 -0
- package/providers/generator.provider.d.ts +4 -0
- package/providers/generator.provider.js +4 -0
- package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
- package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
- package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
- package/redis-lock/examples/lock-strategy.examples.js +130 -15
- package/redis-lock/index.d.ts +2 -0
- package/redis-lock/index.js +8 -1
- package/redis-lock/lock-heartbeat.service.d.ts +78 -0
- package/redis-lock/lock-heartbeat.service.js +222 -0
- package/redis-lock/redis-lock.decorator.d.ts +101 -0
- package/redis-lock/redis-lock.decorator.js +120 -0
- package/redis-lock/redis-lock.module.d.ts +66 -0
- package/redis-lock/redis-lock.module.js +175 -70
- package/redis-lock/redis-lock.service.d.ts +260 -0
- package/redis-lock/redis-lock.service.js +244 -4
- package/setup/bootstrap.setup.js +20 -0
- package/setup/mode.setup.d.ts +44 -0
- package/setup/mode.setup.js +44 -0
- package/setup/schedule.decorator.d.ts +227 -0
- package/setup/schedule.decorator.js +219 -6
- package/setup/worker.decorator.d.ts +86 -0
- package/setup/worker.decorator.js +88 -0
- package/shared/serviceRegistryModule.js +9 -1
- package/shared/services/api-config.service.d.ts +3 -0
- package/shared/services/api-config.service.js +20 -9
- package/validator-json/decorators.d.ts +17 -0
- package/validator-json/decorators.js +17 -2
- package/validator-json/default.d.ts +6 -0
- package/validator-json/default.js +30 -2
- package/validator-json/defaultConverters.js +1 -0
- package/validator-json/options.d.ts +23 -0
- package/validators/common-validators.d.ts +143 -0
- package/validators/common-validators.js +249 -0
- package/validators/custom-validate.examples.d.ts +96 -0
- package/validators/custom-validate.examples.js +400 -0
- package/validators/custom-validate.validator.d.ts +134 -0
- package/validators/custom-validate.validator.js +214 -0
- package/validators/index.d.ts +2 -0
- package/validators/index.js +2 -0
- package/validators/is-exists.validator.d.ts +18 -4
- package/validators/is-exists.validator.js +67 -6
- package/validators/is-unique.validator.d.ts +32 -5
- package/validators/is-unique.validator.js +99 -17
- package/validators/skip-empty.validator.d.ts +5 -0
- package/validators/skip-empty.validator.js +5 -0
- package/vault/interfaces/vault-options.interface.d.ts +9 -0
- package/vault/vault-config.loader.d.ts +30 -0
- package/vault/vault-config.loader.js +48 -1
- package/vault/vault-config.service.d.ts +53 -0
- package/vault/vault-config.service.js +57 -0
- package/vault/vault.module.d.ts +4 -0
- package/vault/vault.module.js +4 -0
- package/decorators/examples/validation-decorators.example.d.ts +0 -69
- package/decorators/examples/validation-decorators.example.js +0 -331
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 基础缓存使用示例
|
|
4
|
+
*/
|
|
2
5
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
6
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
7
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -22,16 +25,18 @@ exports.CacheMonitoringService = exports.PostService = exports.UserService = voi
|
|
|
22
25
|
exports.demonstrateCacheUsage = demonstrateCacheUsage;
|
|
23
26
|
const common_1 = require("@nestjs/common");
|
|
24
27
|
const index_1 = require("../index");
|
|
28
|
+
// 模拟的仓库类
|
|
25
29
|
class UserRepository {
|
|
26
30
|
findOne(id) {
|
|
27
31
|
return __awaiter(this, void 0, void 0, function* () {
|
|
32
|
+
// 模拟数据库查询
|
|
28
33
|
console.log(`[DB] 查询用户 ${id}`);
|
|
29
34
|
return {
|
|
30
35
|
id,
|
|
31
36
|
name: `User ${id}`,
|
|
32
37
|
email: `user${id}@example.com`,
|
|
33
38
|
profile: {
|
|
34
|
-
bio: `这是用户 ${id} 的个人简介`.repeat(10),
|
|
39
|
+
bio: `这是用户 ${id} 的个人简介`.repeat(10), // 长文本,用于测试压缩
|
|
35
40
|
avatar: `avatar_${id}.jpg`,
|
|
36
41
|
},
|
|
37
42
|
};
|
|
@@ -80,37 +85,45 @@ class PostRepository {
|
|
|
80
85
|
.map((_, i) => ({
|
|
81
86
|
id: `post_${authorId}_${i}`,
|
|
82
87
|
title: `文章 ${i}`,
|
|
83
|
-
content: `这是文章 ${i} 的内容`.repeat(15),
|
|
88
|
+
content: `这是文章 ${i} 的内容`.repeat(15), // 长内容,用于测试压缩
|
|
84
89
|
authorId,
|
|
85
90
|
createdAt: new Date(),
|
|
86
91
|
}));
|
|
87
92
|
});
|
|
88
93
|
}
|
|
89
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* 用户服务示例
|
|
97
|
+
*/
|
|
90
98
|
let UserService = class UserService {
|
|
91
99
|
constructor(cacheService, userRepository) {
|
|
92
100
|
this.cacheService = cacheService;
|
|
93
101
|
this.userRepository = userRepository;
|
|
94
102
|
}
|
|
103
|
+
// 基础缓存使用
|
|
95
104
|
getUser(id) {
|
|
96
105
|
return __awaiter(this, void 0, void 0, function* () {
|
|
97
106
|
return yield this.cacheService.getOrSet(`user:${id}`, () => this.userRepository.findOne(id), { ttl: 300000 });
|
|
98
107
|
});
|
|
99
108
|
}
|
|
109
|
+
// 使用装饰器缓存
|
|
100
110
|
getUserProfile(id) {
|
|
101
111
|
return __awaiter(this, void 0, void 0, function* () {
|
|
102
112
|
return yield this.userRepository.findOne(id);
|
|
103
113
|
});
|
|
104
114
|
}
|
|
115
|
+
// 条件缓存 - 不缓存管理员用户
|
|
105
116
|
getUserData(id) {
|
|
106
117
|
return __awaiter(this, void 0, void 0, function* () {
|
|
107
118
|
return yield this.userRepository.findOne(id);
|
|
108
119
|
});
|
|
109
120
|
}
|
|
121
|
+
// 批量获取用户
|
|
110
122
|
getUsersBatch(ids) {
|
|
111
123
|
return __awaiter(this, void 0, void 0, function* () {
|
|
112
124
|
const keys = ids.map((id) => `user:${id}`);
|
|
113
125
|
const cachedUsers = yield this.cacheService.mget(keys);
|
|
126
|
+
// 找出缓存中没有的用户
|
|
114
127
|
const uncachedIds = [];
|
|
115
128
|
const result = [];
|
|
116
129
|
cachedUsers.forEach((user, index) => {
|
|
@@ -121,8 +134,10 @@ let UserService = class UserService {
|
|
|
121
134
|
uncachedIds.push(ids[index]);
|
|
122
135
|
}
|
|
123
136
|
});
|
|
137
|
+
// 批量查询未缓存的用户
|
|
124
138
|
if (uncachedIds.length > 0) {
|
|
125
139
|
const newUsers = yield this.userRepository.findMany(uncachedIds);
|
|
140
|
+
// 批量设置缓存
|
|
126
141
|
const cacheItems = newUsers.map((user) => ({
|
|
127
142
|
key: `user:${user.id}`,
|
|
128
143
|
value: user,
|
|
@@ -133,22 +148,26 @@ let UserService = class UserService {
|
|
|
133
148
|
return result;
|
|
134
149
|
});
|
|
135
150
|
}
|
|
151
|
+
// 更新用户并缓存
|
|
136
152
|
updateUser(id, data) {
|
|
137
153
|
return __awaiter(this, void 0, void 0, function* () {
|
|
138
154
|
const updatedUser = yield this.userRepository.save(Object.assign({ id }, data));
|
|
139
155
|
return updatedUser;
|
|
140
156
|
});
|
|
141
157
|
}
|
|
158
|
+
// 删除用户并清除缓存
|
|
142
159
|
deleteUser(id) {
|
|
143
160
|
return __awaiter(this, void 0, void 0, function* () {
|
|
144
161
|
yield this.userRepository.delete(id);
|
|
145
162
|
});
|
|
146
163
|
}
|
|
164
|
+
// 使用标签失效
|
|
147
165
|
invalidateAllProfiles() {
|
|
148
166
|
return __awaiter(this, void 0, void 0, function* () {
|
|
149
167
|
console.log('清除所有用户资料缓存');
|
|
150
168
|
});
|
|
151
169
|
}
|
|
170
|
+
// 缓存大数据(测试压缩)
|
|
152
171
|
cacheLargeData(id) {
|
|
153
172
|
return __awaiter(this, void 0, void 0, function* () {
|
|
154
173
|
const largeData = {
|
|
@@ -173,11 +192,13 @@ let UserService = class UserService {
|
|
|
173
192
|
averageRating: (Math.random() * 5).toFixed(2),
|
|
174
193
|
},
|
|
175
194
|
};
|
|
195
|
+
// 这个数据会被自动压缩,因为大于 1KB
|
|
176
196
|
yield this.cacheService.set(`user:${id}:large-data`, largeData, {
|
|
177
|
-
ttl: 3600000,
|
|
197
|
+
ttl: 3600000, // 1小时
|
|
178
198
|
});
|
|
179
199
|
});
|
|
180
200
|
}
|
|
201
|
+
// 获取大数据
|
|
181
202
|
getLargeData(id) {
|
|
182
203
|
return __awaiter(this, void 0, void 0, function* () {
|
|
183
204
|
return yield this.cacheService.get(`user:${id}:large-data`);
|
|
@@ -188,7 +209,7 @@ exports.UserService = UserService;
|
|
|
188
209
|
__decorate([
|
|
189
210
|
(0, index_1.Cacheable)({
|
|
190
211
|
key: (id) => `user:${id}:profile`,
|
|
191
|
-
ttl: 600000,
|
|
212
|
+
ttl: 600000, // 10分钟
|
|
192
213
|
dependencies: [new index_1.TagDependency(['user-profile'])],
|
|
193
214
|
}),
|
|
194
215
|
__metadata("design:type", Function),
|
|
@@ -235,18 +256,24 @@ exports.UserService = UserService = __decorate([
|
|
|
235
256
|
__metadata("design:paramtypes", [index_1.CacheService,
|
|
236
257
|
UserRepository])
|
|
237
258
|
], UserService);
|
|
259
|
+
/**
|
|
260
|
+
* 文章服务示例 - 展示依赖使用
|
|
261
|
+
*/
|
|
238
262
|
let PostService = class PostService {
|
|
239
263
|
constructor(cacheService, postRepository) {
|
|
240
264
|
this.cacheService = cacheService;
|
|
241
265
|
this.postRepository = postRepository;
|
|
242
266
|
}
|
|
267
|
+
// 使用数据库依赖 - 当用户表更新时,相关文章缓存会自动失效
|
|
243
268
|
getPostsByAuthor(authorId) {
|
|
244
269
|
return __awaiter(this, void 0, void 0, function* () {
|
|
245
270
|
return yield this.postRepository.findByAuthor(authorId);
|
|
246
271
|
});
|
|
247
272
|
}
|
|
273
|
+
// 使用回调依赖 - 基于配置版本
|
|
248
274
|
getFeaturedPosts() {
|
|
249
275
|
return __awaiter(this, void 0, void 0, function* () {
|
|
276
|
+
// 模拟获取推荐文章
|
|
250
277
|
console.log('[DB] 获取推荐文章');
|
|
251
278
|
return Array(10)
|
|
252
279
|
.fill(null)
|
|
@@ -261,6 +288,7 @@ let PostService = class PostService {
|
|
|
261
288
|
}
|
|
262
289
|
getConfigVersion() {
|
|
263
290
|
return __awaiter(this, void 0, void 0, function* () {
|
|
291
|
+
// 模拟获取配置版本
|
|
264
292
|
return '1.0.0';
|
|
265
293
|
});
|
|
266
294
|
}
|
|
@@ -269,7 +297,7 @@ exports.PostService = PostService;
|
|
|
269
297
|
__decorate([
|
|
270
298
|
(0, index_1.Cacheable)({
|
|
271
299
|
key: (authorId) => `posts:by-author:${authorId}`,
|
|
272
|
-
ttl: 600000,
|
|
300
|
+
ttl: 600000, // 10分钟
|
|
273
301
|
dependencies: [
|
|
274
302
|
new index_1.DbDependency('SELECT updated_at FROM users WHERE id = ?', (authorId) => [authorId]),
|
|
275
303
|
],
|
|
@@ -281,10 +309,11 @@ __decorate([
|
|
|
281
309
|
__decorate([
|
|
282
310
|
(0, index_1.Cacheable)({
|
|
283
311
|
key: 'posts:featured',
|
|
284
|
-
ttl: 1800000,
|
|
312
|
+
ttl: 1800000, // 30分钟
|
|
285
313
|
dependencies: [
|
|
286
314
|
new index_1.CallbackDependency(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
287
|
-
|
|
315
|
+
// 检查配置版本,如果配置改变则失效缓存
|
|
316
|
+
return yield 'v1.0.0'; // 简化为固定值
|
|
288
317
|
})),
|
|
289
318
|
],
|
|
290
319
|
}),
|
|
@@ -297,10 +326,14 @@ exports.PostService = PostService = __decorate([
|
|
|
297
326
|
__metadata("design:paramtypes", [index_1.CacheService,
|
|
298
327
|
PostRepository])
|
|
299
328
|
], PostService);
|
|
329
|
+
/**
|
|
330
|
+
* 缓存统计和监控示例
|
|
331
|
+
*/
|
|
300
332
|
let CacheMonitoringService = class CacheMonitoringService {
|
|
301
333
|
constructor(cacheService) {
|
|
302
334
|
this.cacheService = cacheService;
|
|
303
335
|
}
|
|
336
|
+
// 获取缓存统计信息
|
|
304
337
|
getCacheStats() {
|
|
305
338
|
const stats = this.cacheService.getStats();
|
|
306
339
|
console.log('=== 缓存统计信息 ===');
|
|
@@ -317,13 +350,16 @@ let CacheMonitoringService = class CacheMonitoringService {
|
|
|
317
350
|
}
|
|
318
351
|
return stats;
|
|
319
352
|
}
|
|
353
|
+
// 重置统计
|
|
320
354
|
resetStats() {
|
|
321
355
|
this.cacheService.resetStats();
|
|
322
356
|
console.log('缓存统计已重置');
|
|
323
357
|
}
|
|
358
|
+
// 定期监控
|
|
324
359
|
startMonitoring(intervalMs = 60000) {
|
|
325
360
|
setInterval(() => {
|
|
326
361
|
const stats = this.getCacheStats();
|
|
362
|
+
// 如果命中率过低,发出警告
|
|
327
363
|
if (stats.hitRate < 0.7) {
|
|
328
364
|
console.warn(`⚠️ 缓存命中率过低: ${(stats.hitRate * 100).toFixed(2)}%`);
|
|
329
365
|
}
|
|
@@ -336,38 +372,56 @@ exports.CacheMonitoringService = CacheMonitoringService = __decorate([
|
|
|
336
372
|
(0, common_1.Injectable)(),
|
|
337
373
|
__metadata("design:paramtypes", [index_1.CacheService])
|
|
338
374
|
], CacheMonitoringService);
|
|
375
|
+
/**
|
|
376
|
+
* 使用示例
|
|
377
|
+
*/
|
|
339
378
|
function demonstrateCacheUsage() {
|
|
340
379
|
return __awaiter(this, void 0, void 0, function* () {
|
|
341
|
-
|
|
380
|
+
// 注意:在实际应用中,这些服务会通过依赖注入获得
|
|
381
|
+
const userService = new UserService(new index_1.CacheService(
|
|
382
|
+
// 这些参数在实际应用中会通过模块配置自动注入
|
|
383
|
+
{}, // CLS Provider
|
|
384
|
+
{}, // Memory Provider
|
|
385
|
+
{}, // Redis Provider
|
|
386
|
+
true, // 启用压缩
|
|
387
|
+
1024), new UserRepository());
|
|
342
388
|
const postService = new PostService(new index_1.CacheService({}, {}, {}, true, 1024), new PostRepository());
|
|
343
389
|
const monitoringService = new CacheMonitoringService(new index_1.CacheService({}, {}, {}, true, 1024));
|
|
344
390
|
console.log('🚀 开始缓存演示...\n');
|
|
345
391
|
try {
|
|
392
|
+
// 1. 基础缓存演示
|
|
346
393
|
console.log('1. 基础缓存使用:');
|
|
347
394
|
const user1 = yield userService.getUser('1');
|
|
348
395
|
console.log(`获取用户: ${user1.name}`);
|
|
396
|
+
// 第二次获取应该从缓存获取
|
|
349
397
|
const user1Cached = yield userService.getUser('1');
|
|
350
398
|
console.log(`从缓存获取用户: ${user1Cached.name}\n`);
|
|
399
|
+
// 2. 装饰器缓存演示
|
|
351
400
|
console.log('2. 装饰器缓存:');
|
|
352
401
|
const profile = yield userService.getUserProfile('2');
|
|
353
402
|
console.log(`获取用户资料: ${profile.name}`);
|
|
354
403
|
const profileCached = yield userService.getUserProfile('2');
|
|
355
404
|
console.log(`从缓存获取用户资料: ${profileCached.name}\n`);
|
|
405
|
+
// 3. 批量操作演示
|
|
356
406
|
console.log('3. 批量操作:');
|
|
357
407
|
const users = yield userService.getUsersBatch(['1', '2', '3', '4', '5']);
|
|
358
408
|
console.log(`批量获取 ${users.length} 个用户\n`);
|
|
409
|
+
// 4. 大数据压缩演示
|
|
359
410
|
console.log('4. 大数据压缩:');
|
|
360
411
|
yield userService.cacheLargeData('1');
|
|
361
412
|
console.log('缓存大数据完成(应该自动压缩)');
|
|
362
413
|
const largeData = yield userService.getLargeData('1');
|
|
363
414
|
console.log(`获取大数据: 用户 ${largeData.user.name}, 文章数 ${largeData.posts.length}\n`);
|
|
415
|
+
// 5. 依赖系统演示
|
|
364
416
|
console.log('5. 依赖系统:');
|
|
365
417
|
const posts = yield postService.getPostsByAuthor('1');
|
|
366
418
|
console.log(`获取作者文章: ${posts.length} 篇`);
|
|
367
419
|
const featuredPosts = yield postService.getFeaturedPosts();
|
|
368
420
|
console.log(`获取推荐文章: ${featuredPosts.length} 篇\n`);
|
|
421
|
+
// 6. 缓存统计
|
|
369
422
|
console.log('6. 缓存统计:');
|
|
370
423
|
monitoringService.getCacheStats();
|
|
424
|
+
// 7. 缓存失效演示
|
|
371
425
|
console.log('\n7. 缓存失效:');
|
|
372
426
|
yield userService.invalidateAllProfiles();
|
|
373
427
|
console.log('已清除所有用户资料缓存');
|
package/cache/index.js
CHANGED
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.KeyGenerator = exports.DependencyManager = exports.CacheLayer = exports.TimeDependency = exports.TagDependency = exports.FileDependency = exports.DbDependency = exports.ChainDependency = exports.CallbackDependency = exports.REDIS_CLIENT = exports.BaseCacheProvider = exports.RedisCacheProvider = exports.MemoryCacheProvider = exports.ClsCacheProvider = exports.setCacheService = exports.getCacheService = exports.CachePut = exports.CacheEvict = exports.Cacheable = exports.CacheSerializationService = exports.CacheMetricsService = exports.CacheWarmupService = exports.CacheHealthChecker = exports.CacheService = exports.CACHE_COMPRESSION_THRESHOLD = exports.CACHE_COMPRESSION_ENABLED = exports.CACHE_SERVICE = exports.CacheModule = void 0;
|
|
4
|
+
// Module
|
|
4
5
|
var cache_module_1 = require("./cache.module");
|
|
5
6
|
Object.defineProperty(exports, "CacheModule", { enumerable: true, get: function () { return cache_module_1.CacheModule; } });
|
|
6
7
|
Object.defineProperty(exports, "CACHE_SERVICE", { enumerable: true, get: function () { return cache_module_1.CACHE_SERVICE; } });
|
|
8
|
+
// Constants
|
|
7
9
|
var cache_constants_1 = require("./cache.constants");
|
|
8
10
|
Object.defineProperty(exports, "CACHE_COMPRESSION_ENABLED", { enumerable: true, get: function () { return cache_constants_1.CACHE_COMPRESSION_ENABLED; } });
|
|
9
11
|
Object.defineProperty(exports, "CACHE_COMPRESSION_THRESHOLD", { enumerable: true, get: function () { return cache_constants_1.CACHE_COMPRESSION_THRESHOLD; } });
|
|
12
|
+
// Service
|
|
10
13
|
var cache_service_1 = require("./cache.service");
|
|
11
14
|
Object.defineProperty(exports, "CacheService", { enumerable: true, get: function () { return cache_service_1.CacheService; } });
|
|
15
|
+
// Additional Services
|
|
12
16
|
var cache_health_1 = require("./cache.health");
|
|
13
17
|
Object.defineProperty(exports, "CacheHealthChecker", { enumerable: true, get: function () { return cache_health_1.CacheHealthChecker; } });
|
|
14
18
|
var cache_warmup_service_1 = require("./cache.warmup.service");
|
|
@@ -17,12 +21,14 @@ var cache_metrics_service_1 = require("./cache-metrics.service");
|
|
|
17
21
|
Object.defineProperty(exports, "CacheMetricsService", { enumerable: true, get: function () { return cache_metrics_service_1.CacheMetricsService; } });
|
|
18
22
|
var cache_serialization_service_1 = require("./cache-serialization.service");
|
|
19
23
|
Object.defineProperty(exports, "CacheSerializationService", { enumerable: true, get: function () { return cache_serialization_service_1.CacheSerializationService; } });
|
|
24
|
+
// Decorators
|
|
20
25
|
var decorators_1 = require("./decorators");
|
|
21
26
|
Object.defineProperty(exports, "Cacheable", { enumerable: true, get: function () { return decorators_1.Cacheable; } });
|
|
22
27
|
Object.defineProperty(exports, "CacheEvict", { enumerable: true, get: function () { return decorators_1.CacheEvict; } });
|
|
23
28
|
Object.defineProperty(exports, "CachePut", { enumerable: true, get: function () { return decorators_1.CachePut; } });
|
|
24
29
|
Object.defineProperty(exports, "getCacheService", { enumerable: true, get: function () { return decorators_1.getCacheService; } });
|
|
25
30
|
Object.defineProperty(exports, "setCacheService", { enumerable: true, get: function () { return decorators_1.setCacheService; } });
|
|
31
|
+
// Providers
|
|
26
32
|
var providers_1 = require("./providers");
|
|
27
33
|
Object.defineProperty(exports, "ClsCacheProvider", { enumerable: true, get: function () { return providers_1.ClsCacheProvider; } });
|
|
28
34
|
Object.defineProperty(exports, "MemoryCacheProvider", { enumerable: true, get: function () { return providers_1.MemoryCacheProvider; } });
|
|
@@ -30,6 +36,7 @@ Object.defineProperty(exports, "RedisCacheProvider", { enumerable: true, get: fu
|
|
|
30
36
|
Object.defineProperty(exports, "BaseCacheProvider", { enumerable: true, get: function () { return providers_1.BaseCacheProvider; } });
|
|
31
37
|
var redis_cache_provider_1 = require("./providers/redis-cache.provider");
|
|
32
38
|
Object.defineProperty(exports, "REDIS_CLIENT", { enumerable: true, get: function () { return redis_cache_provider_1.REDIS_CLIENT; } });
|
|
39
|
+
// Dependencies
|
|
33
40
|
var dependencies_1 = require("./dependencies");
|
|
34
41
|
Object.defineProperty(exports, "CallbackDependency", { enumerable: true, get: function () { return dependencies_1.CallbackDependency; } });
|
|
35
42
|
Object.defineProperty(exports, "ChainDependency", { enumerable: true, get: function () { return dependencies_1.ChainDependency; } });
|
|
@@ -37,8 +44,10 @@ Object.defineProperty(exports, "DbDependency", { enumerable: true, get: function
|
|
|
37
44
|
Object.defineProperty(exports, "FileDependency", { enumerable: true, get: function () { return dependencies_1.FileDependency; } });
|
|
38
45
|
Object.defineProperty(exports, "TagDependency", { enumerable: true, get: function () { return dependencies_1.TagDependency; } });
|
|
39
46
|
Object.defineProperty(exports, "TimeDependency", { enumerable: true, get: function () { return dependencies_1.TimeDependency; } });
|
|
47
|
+
// Interfaces
|
|
40
48
|
var interfaces_1 = require("./interfaces");
|
|
41
49
|
Object.defineProperty(exports, "CacheLayer", { enumerable: true, get: function () { return interfaces_1.CacheLayer; } });
|
|
50
|
+
// Utils (advanced usage)
|
|
42
51
|
var utils_1 = require("./utils");
|
|
43
52
|
Object.defineProperty(exports, "DependencyManager", { enumerable: true, get: function () { return utils_1.DependencyManager; } });
|
|
44
53
|
Object.defineProperty(exports, "KeyGenerator", { enumerable: true, get: function () { return utils_1.KeyGenerator; } });
|
|
@@ -1,11 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cache dependency interface - similar to Yii2 cache dependency system
|
|
3
|
+
*
|
|
4
|
+
* A cache dependency represents a dependency relationship between cached data
|
|
5
|
+
* and some external state. When the external state changes, the cached data
|
|
6
|
+
* becomes invalid.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* // Tag-based dependency
|
|
11
|
+
* new TagDependency(['user-list'])
|
|
12
|
+
*
|
|
13
|
+
* // Database-based dependency
|
|
14
|
+
* new DbDependency('SELECT MAX(updated_at) FROM users WHERE id = ?', [userId])
|
|
15
|
+
*
|
|
16
|
+
* // Callback-based dependency
|
|
17
|
+
* new CallbackDependency(() => ConfigService.get('app.version'))
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
1
20
|
export interface CacheDependency {
|
|
21
|
+
/**
|
|
22
|
+
* Get a unique key that identifies this dependency
|
|
23
|
+
* This key is used to store the dependency state
|
|
24
|
+
*
|
|
25
|
+
* @returns Unique dependency key
|
|
26
|
+
*/
|
|
2
27
|
getKey(): string;
|
|
28
|
+
/**
|
|
29
|
+
* Get the current state/value of this dependency
|
|
30
|
+
* This value will be compared with stored state to detect changes
|
|
31
|
+
*
|
|
32
|
+
* @returns Current dependency data/state
|
|
33
|
+
*/
|
|
3
34
|
getData(): Promise<any>;
|
|
35
|
+
/**
|
|
36
|
+
* Check if the dependency has changed by comparing old data with current data
|
|
37
|
+
*
|
|
38
|
+
* @param oldData - Previously stored dependency data
|
|
39
|
+
* @returns true if dependency has changed, false otherwise
|
|
40
|
+
*/
|
|
4
41
|
isChanged(oldData: any): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Reset/clear the dependency state
|
|
44
|
+
* Used when manually invalidating dependencies
|
|
45
|
+
*/
|
|
5
46
|
reset?(): Promise<void>;
|
|
6
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Serialized dependency data stored alongside cached values
|
|
50
|
+
*/
|
|
7
51
|
export interface DependencyData {
|
|
52
|
+
/**
|
|
53
|
+
* Dependency key
|
|
54
|
+
*/
|
|
8
55
|
key: string;
|
|
56
|
+
/**
|
|
57
|
+
* Dependency state snapshot at cache time
|
|
58
|
+
*/
|
|
9
59
|
data: any;
|
|
60
|
+
/**
|
|
61
|
+
* Timestamp when dependency was captured
|
|
62
|
+
*/
|
|
10
63
|
timestamp: number;
|
|
11
64
|
}
|
|
@@ -1,32 +1,113 @@
|
|
|
1
1
|
import type { CacheDependency } from './cache-dependency.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Cache layer enum - defines the three-tier cache architecture
|
|
4
|
+
*/
|
|
2
5
|
export declare enum CacheLayer {
|
|
6
|
+
/** L1: Request-level cache (nestjs-cls) - fastest, scoped to request */
|
|
3
7
|
CLS = "cls",
|
|
8
|
+
/** L2: Process-level cache (native Map) - fast, scoped to process */
|
|
4
9
|
MEMORY = "memory",
|
|
10
|
+
/** L3: Distributed cache (Redis) - persistent, shared across processes */
|
|
5
11
|
REDIS = "redis"
|
|
6
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Cache configuration options
|
|
15
|
+
*/
|
|
7
16
|
export interface CacheOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Time to live in milliseconds
|
|
19
|
+
* @example 300_000 // 5 minutes
|
|
20
|
+
*/
|
|
8
21
|
ttl?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Cache layers to use
|
|
24
|
+
* @default [CacheLayer.MEMORY, CacheLayer.REDIS]
|
|
25
|
+
*/
|
|
9
26
|
layers?: CacheLayer[];
|
|
27
|
+
/**
|
|
28
|
+
* Key prefix for namespacing
|
|
29
|
+
* @example 'user:' will result in keys like 'user:123'
|
|
30
|
+
*/
|
|
10
31
|
prefix?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Condition function to determine if value should be cached
|
|
34
|
+
* @param args - Method arguments
|
|
35
|
+
* @returns true to cache, false to skip
|
|
36
|
+
*/
|
|
11
37
|
condition?: (...args: any[]) => boolean | Promise<boolean>;
|
|
38
|
+
/**
|
|
39
|
+
* Cache dependencies - cache will be invalidated when dependencies change
|
|
40
|
+
* Similar to Yii2 cache dependency system
|
|
41
|
+
*/
|
|
12
42
|
dependencies?: CacheDependency[];
|
|
43
|
+
/**
|
|
44
|
+
* Whether to backfill upper cache layers when value is found in lower layer
|
|
45
|
+
* @default true
|
|
46
|
+
*/
|
|
13
47
|
backfill?: boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Namespace for grouping related cache keys
|
|
50
|
+
*/
|
|
14
51
|
namespace?: string;
|
|
15
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Options for cache decorator key generation
|
|
55
|
+
*/
|
|
16
56
|
export interface CacheKeyOptions {
|
|
57
|
+
/**
|
|
58
|
+
* Static key or key generator function
|
|
59
|
+
*/
|
|
17
60
|
key?: string | ((...args: any[]) => string);
|
|
61
|
+
/**
|
|
62
|
+
* Key prefix
|
|
63
|
+
*/
|
|
18
64
|
prefix?: string;
|
|
65
|
+
/**
|
|
66
|
+
* Whether to include all method arguments in key generation
|
|
67
|
+
* @default false
|
|
68
|
+
*/
|
|
19
69
|
includeAllArgs?: boolean;
|
|
20
70
|
}
|
|
71
|
+
/**
|
|
72
|
+
* Options for @Cacheable decorator
|
|
73
|
+
*/
|
|
21
74
|
export interface CacheableOptions extends CacheOptions, CacheKeyOptions {
|
|
22
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* Options for @CacheEvict decorator
|
|
78
|
+
*/
|
|
23
79
|
export interface CacheEvictOptions {
|
|
80
|
+
/**
|
|
81
|
+
* Keys to evict (can be static strings or generator functions)
|
|
82
|
+
*/
|
|
24
83
|
keys?: Array<string | ((...args: any[]) => string)>;
|
|
84
|
+
/**
|
|
85
|
+
* Patterns to match for eviction (supports wildcards)
|
|
86
|
+
* @example ['user:*', 'posts:list:*']
|
|
87
|
+
*/
|
|
25
88
|
patterns?: string[];
|
|
89
|
+
/**
|
|
90
|
+
* Tags to invalidate
|
|
91
|
+
*/
|
|
26
92
|
tags?: string[];
|
|
93
|
+
/**
|
|
94
|
+
* Cache layers to evict from
|
|
95
|
+
*/
|
|
27
96
|
layers?: CacheLayer[];
|
|
97
|
+
/**
|
|
98
|
+
* Condition to determine if eviction should occur
|
|
99
|
+
* @param args - Method arguments
|
|
100
|
+
* @param result - Method return value
|
|
101
|
+
*/
|
|
28
102
|
condition?: (...args: any[]) => boolean | Promise<boolean>;
|
|
103
|
+
/**
|
|
104
|
+
* Whether to evict before or after method execution
|
|
105
|
+
* @default 'after'
|
|
106
|
+
*/
|
|
29
107
|
timing?: 'before' | 'after';
|
|
30
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Options for @CachePut decorator
|
|
111
|
+
*/
|
|
31
112
|
export interface CachePutOptions extends CacheOptions, CacheKeyOptions {
|
|
32
113
|
}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CacheLayer = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Cache layer enum - defines the three-tier cache architecture
|
|
6
|
+
*/
|
|
4
7
|
var CacheLayer;
|
|
5
8
|
(function (CacheLayer) {
|
|
9
|
+
/** L1: Request-level cache (nestjs-cls) - fastest, scoped to request */
|
|
6
10
|
CacheLayer["CLS"] = "cls";
|
|
11
|
+
/** L2: Process-level cache (native Map) - fast, scoped to process */
|
|
7
12
|
CacheLayer["MEMORY"] = "memory";
|
|
13
|
+
/** L3: Distributed cache (Redis) - persistent, shared across processes */
|
|
8
14
|
CacheLayer["REDIS"] = "redis";
|
|
9
15
|
})(CacheLayer || (exports.CacheLayer = CacheLayer = {}));
|
|
@@ -1,28 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base cache provider interface
|
|
3
|
+
* All cache providers (CLS, Memory, Redis) implement this interface
|
|
4
|
+
*/
|
|
1
5
|
export interface CacheProvider {
|
|
6
|
+
/**
|
|
7
|
+
* Get value from cache
|
|
8
|
+
*
|
|
9
|
+
* @param key - Cache key
|
|
10
|
+
* @returns Cached value or null if not found
|
|
11
|
+
*/
|
|
2
12
|
get<T>(key: string): Promise<T | null>;
|
|
13
|
+
/**
|
|
14
|
+
* Set value in cache
|
|
15
|
+
*
|
|
16
|
+
* @param key - Cache key
|
|
17
|
+
* @param value - Value to cache
|
|
18
|
+
* @param ttl - Time to live in milliseconds
|
|
19
|
+
*/
|
|
3
20
|
set<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Delete value from cache
|
|
23
|
+
*
|
|
24
|
+
* @param key - Cache key or array of keys
|
|
25
|
+
*/
|
|
4
26
|
delete(key: string | string[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Delete keys matching a pattern (supports wildcards)
|
|
29
|
+
*
|
|
30
|
+
* @param pattern - Pattern to match (e.g., 'user:*')
|
|
31
|
+
* @returns Number of keys deleted
|
|
32
|
+
*/
|
|
5
33
|
deletePattern?(pattern: string): Promise<number>;
|
|
34
|
+
/**
|
|
35
|
+
* Clear all cache entries
|
|
36
|
+
*/
|
|
6
37
|
clear(): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a key exists in cache
|
|
40
|
+
*
|
|
41
|
+
* @param key - Cache key
|
|
42
|
+
*/
|
|
7
43
|
has(key: string): Promise<boolean>;
|
|
44
|
+
/**
|
|
45
|
+
* Get multiple values at once
|
|
46
|
+
*
|
|
47
|
+
* @param keys - Array of cache keys
|
|
48
|
+
* @returns Array of values (null for missing keys)
|
|
49
|
+
*/
|
|
8
50
|
mget<T>(keys: string[]): Promise<(T | null)[]>;
|
|
51
|
+
/**
|
|
52
|
+
* Set multiple values at once
|
|
53
|
+
*
|
|
54
|
+
* @param items - Array of key-value pairs
|
|
55
|
+
* @param ttl - Time to live in milliseconds
|
|
56
|
+
*/
|
|
9
57
|
mset(items: Array<{
|
|
10
58
|
key: string;
|
|
11
59
|
value: any;
|
|
12
60
|
}>, ttl?: number): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Get provider name
|
|
63
|
+
*/
|
|
13
64
|
getName(): string;
|
|
14
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Cache statistics
|
|
68
|
+
*/
|
|
15
69
|
export interface CacheStats {
|
|
70
|
+
/**
|
|
71
|
+
* Total number of get operations
|
|
72
|
+
*/
|
|
16
73
|
totalGets: number;
|
|
74
|
+
/**
|
|
75
|
+
* Number of cache hits
|
|
76
|
+
*/
|
|
17
77
|
hits: number;
|
|
78
|
+
/**
|
|
79
|
+
* Number of cache misses
|
|
80
|
+
*/
|
|
18
81
|
misses: number;
|
|
82
|
+
/**
|
|
83
|
+
* Hit rate (hits / totalGets)
|
|
84
|
+
*/
|
|
19
85
|
hitRate: number;
|
|
86
|
+
/**
|
|
87
|
+
* Stats per layer
|
|
88
|
+
*/
|
|
20
89
|
byLayer: Record<string, {
|
|
21
90
|
hits: number;
|
|
22
91
|
misses: number;
|
|
23
92
|
hitRate: number;
|
|
24
93
|
}>;
|
|
94
|
+
/**
|
|
95
|
+
* Total number of set operations
|
|
96
|
+
*/
|
|
25
97
|
totalSets: number;
|
|
98
|
+
/**
|
|
99
|
+
* Total number of delete operations
|
|
100
|
+
*/
|
|
26
101
|
totalDeletes: number;
|
|
102
|
+
/**
|
|
103
|
+
* Total number of clear operations
|
|
104
|
+
*/
|
|
27
105
|
totalClears: number;
|
|
28
106
|
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { CacheProvider } from '../interfaces/cache-provider.interface';
|
|
2
|
+
/**
|
|
3
|
+
* Base cache provider with common utility methods
|
|
4
|
+
*/
|
|
2
5
|
export declare abstract class BaseCacheProvider implements CacheProvider {
|
|
3
6
|
abstract get<T>(key: string): Promise<T | null>;
|
|
4
7
|
abstract set<T>(key: string, value: T, ttl?: number): Promise<void>;
|
|
@@ -7,10 +10,21 @@ export declare abstract class BaseCacheProvider implements CacheProvider {
|
|
|
7
10
|
abstract clear(): Promise<void>;
|
|
8
11
|
abstract has(key: string): Promise<boolean>;
|
|
9
12
|
abstract getName(): string;
|
|
13
|
+
/**
|
|
14
|
+
* Get multiple values at once
|
|
15
|
+
* Default implementation - can be overridden for better performance
|
|
16
|
+
*/
|
|
10
17
|
mget<T>(keys: string[]): Promise<(T | null)[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Set multiple values at once
|
|
20
|
+
* Default implementation - can be overridden for better performance
|
|
21
|
+
*/
|
|
11
22
|
mset(items: Array<{
|
|
12
23
|
key: string;
|
|
13
24
|
value: any;
|
|
14
25
|
}>, ttl?: number): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Convert wildcard pattern to RegExp
|
|
28
|
+
*/
|
|
15
29
|
protected patternToRegex(pattern: string): RegExp;
|
|
16
30
|
}
|