Reduce memory allocation in LimitedMemoryAdapter (#272)

* refactor(LimitedMemoryAdapter): optimize scan function

Reduced the memory allocation by not creating a different array to iterate. Precalculated wildcard

* refactor(LimitedMemoryAdapter): optimize ulkGet function

Optimize the ulkGet function by not creating a different array once. Used Set for faster lookups.

* refactor(LimitedMemoryAdapter): rename keys to key in the get() function
This commit is contained in:
Mohtasim Alam Sohom 2024-10-06 19:30:59 +06:00 committed by GitHub
parent 5926b4df15
commit 4fb4861386
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -63,31 +63,36 @@ export class LimitedMemoryAdapter<T> implements Adapter {
scan(query: string, keys?: false): any[];
scan(query: string, keys: true): string[];
scan(query: string, keys = false) {
const values: (string | unknown)[] = [];
const sq = query.split('.');
for (const iterator of [...this.storage.values()].flatMap(x => x.entries()))
for (const [key, value] of iterator) {
if (key.split('.').every((value, i) => (sq[i] === '*' ? !!value : sq[i] === value))) {
values.push(keys ? key : this.options.decode(value.value));
}
}
const isWildcard = sq.map(segment => segment === '*');
return values;
return [...this.storage.values()].flatMap(storageEntry =>
Array.from(storageEntry.entries())
.filter(([key]) => key.split('.').every((value, i) => isWildcard[i] || sq[i] === value))
.map(([key, value]) => (keys ? key : this.options.decode(value.value))),
);
}
bulkGet(keys: string[]) {
const iterator = [...this.storage.values()];
return keys
.map(key => {
const data = iterator.find(x => x.has(key))?.get(key);
return data ? this.options.decode(data) : null;
const storageArray = Array.from(this.storage.values());
const keySet = new Set(keys);
return storageArray
.flatMap(storageEntry => {
const entries = Array.from(storageEntry.entries());
return entries.filter(([key]) => keySet.has(key)).map(([, value]) => this.options.decode(value as T));
})
.filter(x => x);
.filter(Boolean);
}
get(keys: string) {
const data = [...this.storage.values()].find(x => x.has(keys))?.get(keys);
return data ? this.options.decode(data) : null;
get(key: string) {
for (const storageEntry of this.storage.values()) {
if (storageEntry.has(key)) {
const data = storageEntry.get(key);
return data ? this.options.decode(data) : null;
}
}
return null;
}
private __set(key: string, data: any) {