Abfragen cachen
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.