mirror of
https://github.com/tiramisulabs/seyfert.git
synced 2025-07-01 20:46:08 +00:00
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:
parent
5926b4df15
commit
4fb4861386
39
src/cache/adapters/limited.ts
vendored
39
src/cache/adapters/limited.ts
vendored
@ -63,31 +63,36 @@ export class LimitedMemoryAdapter<T> implements Adapter {
|
|||||||
scan(query: string, keys?: false): any[];
|
scan(query: string, keys?: false): any[];
|
||||||
scan(query: string, keys: true): string[];
|
scan(query: string, keys: true): string[];
|
||||||
scan(query: string, keys = false) {
|
scan(query: string, keys = false) {
|
||||||
const values: (string | unknown)[] = [];
|
|
||||||
const sq = query.split('.');
|
const sq = query.split('.');
|
||||||
for (const iterator of [...this.storage.values()].flatMap(x => x.entries()))
|
const isWildcard = sq.map(segment => segment === '*');
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
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[]) {
|
bulkGet(keys: string[]) {
|
||||||
const iterator = [...this.storage.values()];
|
const storageArray = Array.from(this.storage.values());
|
||||||
return keys
|
const keySet = new Set(keys);
|
||||||
.map(key => {
|
|
||||||
const data = iterator.find(x => x.has(key))?.get(key);
|
return storageArray
|
||||||
return data ? this.options.decode(data) : null;
|
.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) {
|
get(key: string) {
|
||||||
const data = [...this.storage.values()].find(x => x.has(keys))?.get(keys);
|
for (const storageEntry of this.storage.values()) {
|
||||||
return data ? this.options.decode(data) : null;
|
if (storageEntry.has(key)) {
|
||||||
|
const data = storageEntry.get(key);
|
||||||
|
return data ? this.options.decode(data) : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private __set(key: string, data: any) {
|
private __set(key: string, data: any) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user