Zum Hauptinhalt springen

Abfragen cachen

Inoffizielle Beta-Übersetzung

Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →

Sie können Ergebnisse der folgenden QueryBuilder-Methoden cachen: getMany, getOne, getRawMany, getRawOne und getCount.

Ebenso können Sie Ergebnisse der find*- und count*-Methoden von Repository und EntityManager cachen.

Um Caching zu aktivieren, müssen Sie es explizit in den Data-Source-Optionen einschalten:

{
type: "mysql",
host: "localhost",
username: "test",
...
cache: true
}

Wenn Sie Caching erstmals aktivieren, müssen Sie Ihr Datenbankschema synchronisieren (per CLI, Migrationen oder der synchronize-Data-Source-Option).

Anschließend können Sie im QueryBuilder den Query-Cache für beliebige Abfragen aktivieren:

const users = await dataSource
.createQueryBuilder(User, "user")
.where("user.isAdmin = :isAdmin", { isAdmin: true })
.cache(true)
.getMany()

Entsprechende Repository-Abfrage:

const users = await dataSource.getRepository(User).find({
where: { isAdmin: true },
cache: true,
})

Dies führt eine Abfrage aus, um alle Admin-Benutzer abzurufen und cacht die Ergebnisse. Beim nächsten Ausführen desselben Codes werden die Admin-Benutzer aus dem Cache bezogen. Die Standard-Cache-Lebensdauer beträgt 1000 ms, also 1 Sekunde. Das bedeutet, der Cache wird 1 Sekunde nach Aufruf des Query-Builder-Codes ungültig. In der Praxis heißt das: Wenn Benutzer 150 Mal innerhalb von 3 Sekunden die Benutzerseite aufrufen, werden in diesem Zeitraum nur drei Datenbankabfragen ausgeführt. Neue Benutzer, die während des 1-Sekunden-Cache-Fensters angelegt werden, erscheinen nicht in den Ergebnissen.

Sie können die Cache-Zeit manuell im QueryBuilder anpassen:

const users = await dataSource
.createQueryBuilder(User, "user")
.where("user.isAdmin = :isAdmin", { isAdmin: true })
.cache(60000) // 1 minute
.getMany()

Oder über Repository:

const users = await dataSource.getRepository(User).find({
where: { isAdmin: true },
cache: 60000,
})

Oder global in den Data-Source-Optionen:

{
type: "mysql",
host: "localhost",
username: "test",
...
cache: {
duration: 30000 // 30 seconds
}
}

Zusätzlich können Sie eine "Cache-ID" im QueryBuilder setzen:

const users = await dataSource
.createQueryBuilder(User, "user")
.where("user.isAdmin = :isAdmin", { isAdmin: true })
.cache("users_admins", 25000)
.getMany()

Oder mit Repository:

const users = await dataSource.getRepository(User).find({
where: { isAdmin: true },
cache: {
id: "users_admins",
milliseconds: 25000,
},
})

Dies ermöglicht eine granulare Cache-Steuerung, zum Beispiel das Löschen von Cache-Ergebnissen bei neuen Benutzereinträgen:

await dataSource.queryResultCache.remove(["users_admins"])

Standardmäßig nutzt TypeORM eine separate Tabelle query-result-cache, in der alle Abfragen und Ergebnisse gespeichert werden. Der Tabellenname ist konfigurierbar, Sie können ihn über die tableName-Eigenschaft ändern:

{
type: "mysql",
host: "localhost",
username: "test",
...
cache: {
type: "database",
tableName: "configurable-table-query-result-cache"
}
}

Falls das Speichern in einer einzelnen Datenbanktabelle ineffizient für Sie ist, können Sie den Cache-Typ auf "redis" oder "ioredis" umstellen. TypeORM speichert dann alle Cache-Einträge in Redis:

{
type: "mysql",
host: "localhost",
username: "test",
...
cache: {
type: "redis",
options: {
socket: {
host: "localhost",
port: 6379
}
}
}
}

"options" können node_redis-spezifische Optionen oder ioredis-spezifische Optionen sein, je nach verwendetem Typ.

Falls Sie eine Verbindung zu einem Redis-Cluster über IORedis-Cluster-Funktionalität herstellen möchten:

{
type: "mysql",
host: "localhost",
username: "test",
cache: {
type: "ioredis/cluster",
options: {
startupNodes: [
{
host: 'localhost',
port: 7000,
},
{
host: 'localhost',
port: 7001,
},
{
host: 'localhost',
port: 7002,
}
],
options: {
scaleReads: 'all',
clusterRetryStrategy: function (times) { return null },
redisOptions: {
maxRetriesPerRequest: 1
}
}
}
}
}

Hinweis: Optionen können weiterhin als erstes Argument im IORedis-Cluster-Konstruktor übergeben werden.

{
...
cache: {
type: "ioredis/cluster",
options: [
{
host: 'localhost',
port: 7000,
},
{
host: 'localhost',
port: 7001,
},
{
host: 'localhost',
port: 7002,
}
]
},
...
}

Wenn keine der integrierten Cache-Provider Ihren Anforderungen genügt, können Sie einen eigenen Cache-Provider über eine provider-Fabrikfunktion bereitstellen, die ein neues Objekt zurückgibt, das das QueryResultCache-Interface implementiert:

class CustomQueryResultCache implements QueryResultCache {
constructor(private dataSource: DataSource) {}
...
}
{
...
cache: {
provider(dataSource) {
return new CustomQueryResultCache(dataSource);
}
}
}

Um Cache-Fehler zu ignorieren und Abfragen bei Cache-Problemen direkt an die Datenbank weiterzuleiten, verwenden Sie die ignoreErrors-Option:

{
type: "mysql",
host: "localhost",
username: "test",
...
cache: {
type: "redis",
options: {
socket: {
host: "localhost",
port: 6379
}
},
ignoreErrors: true
}
}

Mit typeorm cache:clear leeren Sie den gesamten Cache.