NCache, ein Verteilter In-Memory-Cache, hält Ihre Daten in einem temporären Speicher intakt, um Lese- und Schreibvorgänge schneller durchführen zu können. Wir haben gesehen NCache Bewirken Sie Wunder mit der Geschwindigkeit, wenn es um die Leistung geht Operationen im Cache-Speicher. Allerdings behalten NCache Die Synchronisierung mit der Hauptdatenquelle stellt eine große Herausforderung dar, wenn es um die Datenkonsistenz geht. Die Datenquelle kann eine beliebige Datenbank sein; In diesem Blog geht es jedoch darum, Ihren Cache mit PostgreSQL synchron zu halten.
Zwei separate Datenkopien – eine Herausforderung
Der Stack Ihrer Anwendung funktioniert mit NCache Beispielsweise befindet sich der Cache als Caching-Schicht zwischen der Datenbank und der Anwendung. Ihre Anwendung ist direkt mit dem Cache verbunden und sendet somit alle Operationsaufrufe wie Lesen oder Schreiben direkt an den Cache. Nehmen wir an, dass ein anderer Benutzer etwas in der Datenbank ändert, ohne den Cache darüber zu informieren. Jetzt unterscheiden sich die Daten in der Datenbank von den Daten im Cache. Die beiden getrennten Datenkopien führen zu Dateninkonsistenzen, was eine große Herausforderung darstellt.
NCache Details NCache Docs Cache mit PostgreSQL synchronisieren
NCache Daten synchron halten
Angesichts der Herausforderung der Dateninkonsistenz NCache kommt mit einer Lösung dafür, genau wie bei allem anderen. Sie müssen lediglich Ihren Cache mit der Datenbank synchronisieren NCache Datenbanksynchronisierung Techniken. Die in diesem Blog diskutierte Datenbank ist, wie bereits erwähnt, PostgreSQL – eine objektrelationale Open-Source-Datenbank mit einem gut entwickelten Funktionsumfang sowie hoher Leistung und Zuverlässigkeit. Wir haben eine Lösung erstellt und auf GitHub hochgeladen Synchronisieren des Caches mit PostgreSQL Dies zeigt, wie Ihr Cache die Skalierbarkeit und Datenkonsistenz verbessern kann.
Das folgende Diagramm zeigt, wie das funktioniert NCache hilft Ihnen dabei, die Daten mit Ihrer PostgreSQL-Datenbank synchron zu halten.
Synchronisieren NCache mit PostgreSQL-Datenbank
NCache ermöglicht es Ihnen, Ihre Daten mithilfe von PostgreSQL synchron zu halten NotifyExtensibleDependency, das ist eine Synchronisationstechnik, die von bereitgestellt wird NCache um den Cache und die Datenbank synchron zu halten. NotifyExtensibleDependency wird verwendet, um die Datenungültigmachungstechnik mithilfe des PostgreSQL-Abhängigkeitsbenachrichtigungssystems zu implementieren. Die PostgreSQL-Abhängigkeit basiert auf dem LISTEN/NOTIFY-Mechanismus, der dem ähnelt Pub/Sub-Modell.
Zusammen mit der Datenbankabhängigkeit ReadThruProvider wird verwendet, um direkt mit der Datenquelle zu kommunizieren. NCache Ruft den Anbieter auf, um mithilfe Ihrer benutzerdefinierten Logik Daten direkt aus der Datenquelle zu laden. Dadurch bleiben die Daten synchronisiert und aktuell, um Probleme wie veraltete Daten zu vermeiden, und sorgen außerdem für eine verbesserte Skalierbarkeit und schnellere Lesevorgänge.
Die beteiligten Grundkomponenten sind also:
-
- NotifyExtensibleDependency: NCache Registriert sich bei einem bestimmten Kanal, indem es LISTEN in NotifyExtensibleDependency aufruft
Initialize
Methode. In der Datenbank wird eine TRIGGER-Funktion aufgerufen, die eine Nutzlast an den Kanal sendet und beim Abhören im Falle einer Dateninkonsistenz die Daten aus dem Cache entfernt. - ReadThruProvider: Dieser Anbieter ruft die aktualisierten Daten automatisch direkt aus der Datenbank ab, wenn Daten in der Datenbank geändert werden.
- NotifyExtensibleDependency: NCache Registriert sich bei einem bestimmten Kanal, indem es LISTEN in NotifyExtensibleDependency aufruft
NCache Details Durchlesen Benachrichtigungsbasierte Abhängigkeit
Synchronisieren Sie den Cache mit NotifyExtensibleDependency
NotifyExtensibleDependency wird verwendet, um die Daten mithilfe des Mechanismus der PostgreSQL-Abhängigkeit ungültig zu machen, der nach dem Modell von funktioniert Pub/Sub-Nachrichten und das Modell heißt Listen/Notify. Gemäß diesem Mechanismus wird jede Aktualisierung in der Datenbank über einen NOTIFY-Befehl mit einer zusätzlichen Nutzlast, die die Informationen enthält, an den Client weitergeleitet, der auf einem bestimmten Kanal lauscht. Der Kunde in unserem konkreten Fall ist NCache und wenn eine Benachrichtigung über eine Änderung in der Datenbank erfolgt, wird das entsprechende Element aus dem Cache entfernt.
Schauen wir uns den Code unten an, um zu sehen, wie ein Element mit PostgreSQL-Abhängigkeit hinzugefügt wird:
1 2 3 4 5 6 7 8 9 10 11 |
const string connectionString = "your-connection-string"; var customer = new Customer(); var cacheItem = new CacheItem(customer) { Dependency = new PostGreSQLDependency(connectionString, customer.customerid, "public", "customers", "customer_channel") }; var key = customer.customerid; var cache = CacheManager.GetCache("democache"); cache.Insert(key, cacheItem); |
Sie müssen jedoch die Implementierung von verstehen PostgreSQLDependency
und der folgende Code wird helfen. Der Initialize
Die Methode enthält eine Verbindungszeichenfolge zum Herstellen einer Verbindung mit der Datenbank und registriert sich zur Benachrichtigung bei jeder Datenänderung in den spezifischen Daten.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
public PostGreSQLDependency(string connectionString, string dependencyKey, string schema, string table, string channel) { _connectionString = connectionString.Trim(); _dependencyKey = dependencyKey.Trim(); _schema = schema.Trim(); _table = table.Trim(); _channel = channel.Trim(); } public override bool Initialize() { connection = new NpgsqlConnection(_connectionString); connection.Open(); ((NpgsqlConnection)connection).Notification += (o, e) => { var entity = JsonConvert.DeserializeObject(e.AdditionalInformation); if (entity.DependencyKey == _dependencyKey && entity.Table == _table && entity.Schema == _schema) { done = true; } }; using (var cmd = new NpgsqlCommand($"LISTEN {_channel};", (NpgsqlConnection)connection)) { cmd.ExecuteNonQuery(); } task = Task.Run(() => { while (true) { ((NpgsqlConnection)connection).Wait(); if (done) { break; } } this.DependencyChanged.Invoke(this); }); return true; } |
NCache Details NCache Docs Cache mit PostgreSQL synchronisieren
Automatisches Neuladen von Daten mithilfe von Read-Through
Mithilfe der Abhängigkeit werden die Daten bei jeder Änderung in der Datenquelle aus dem Cache gelöscht. Allerdings müssen wir diese Daten auch noch in den Cache laden und dafür NCache hat eine Funktion namens Hintergrundquelle. Wir bieten Read-Through-Anbietern die Freiheit, Ihre benutzerdefinierte Logik in die Implementierung einzufügen. Im angegebenen Fall lädt der Read-Through-Anbieter Daten aus der PostgreSQL-Datenbank. Du brauchst Konfigurieren Sie den Read-Through-Anbieter die Verwendung der Verwaltungstools vorher.
Durch die Verwendung von Resynchronisierungsoptionen im Durchleseanbieter bleiben die Daten mit der Datenbank synchronisiert. Allerdings innerhalb der ProviderCacheItem
, dem CacheItem ist eine Abhängigkeit hinzugefügt, was bedeutet, dass dem neu im Cache hinzugefügten Element bereits eine Abhängigkeit hinzugefügt wurde. Es erspart Ihnen den Aufwand, immer wieder Abhängigkeiten hinzuzufügen. Schaue auf die LoadFromSource
Methode innerhalb des Read-Through-Anbieters, um sich die Implementierung anzusehen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public ProviderCacheItem LoadFromSource(string key) { var query = $"SELECT customerid, address, country, city FROM customers WHERE customerid = '{key}'"; // Define a query returning a single row result set NpgsqlCommand command = new NpgsqlCommand(query, _connection as NpgsqlConnection); var reader = command.ExecuteReader(); ProviderCacheItem providerCacheItem = null; while (reader.Read()) { if (providerCacheItem == null) { var customer = new Customer() { customerid = reader[0] as string, address = reader[1] as string, country = reader[2] as string, city = reader[3] as string, }; providerCacheItem = new ProviderCacheItem(customer) { Dependency = new PostGreSQLDependency(_connectionString, customer.customerid, "public", "customers", "customer_channel"), ResyncOptions = new ResyncOptions(true) }; } } } |
Wenn Sie das Element jetzt mit Durchlesen hinzufügen, werden die geänderten Elemente einfach mit direkt in den Cache geladen Datenbankabhängigkeit. Daher bleibt Ihr Cache mit der PostgreSQL-Datenbank synchronisiert und alle Probleme mit veralteten Daten verschwinden.
Zusammenfassung
Um alles im Blog in einfachen Worten auszudrücken: Ihr Cache und Ihre Datenbank müssen miteinander synchronisiert bleiben. Wenn der Cache keine Änderungen in der Datenbank erkennt, kann Ihre Anwendung weiterhin mit veralteten Cache-Daten arbeiten. Dieses Problem wird mit sehr effizient gelöst NCache PostgreSQL-Abhängigkeitsfunktion. Es gibt jede Menge weitere coole Funktionen, die Sie einfach sehen können, indem Sie auf klicken NCache Website .
NCache Details Editionsvergleich NCache Herunterladen