Zum Hauptinhalt springen

Server-seitige Objekterweiterungen

Garnet bietet verschiedene Möglichkeiten, seine Funktionalität zu erweitern, eine davon ist die Implementierung eines eigenen benutzerdefinierten Objekts; ähnlich dem, was ein Set, List oder Sorted Set bietet, aber mit einem eigenen Objekttyp und benutzerdefinierten Befehlsfunktionen in der C#-Sprache.

In diesem Dokument erklären wir die Implementierung eines neuen Objekttyps, basierend auf dem Dictionary-Typ von C#, und fügen dann einige benutzerdefinierte Befehle hinzu, die diesen neuen Objekttyp verwenden.

Implementierung eines benutzerdefinierten Objekts

Um einen neuen Objekttyp hinzuzufügen, müssen Sie zunächst eine neue Klasse implementieren, die von der Klasse CustomObjectBase erbt. Diese Klasse enthält wesentliche Methoden zur Verwaltung der grundlegenden Funktionalität eines Objekts in Garnet.

Hinzufügen einer Factory-Klasse

Sobald die Implementierung der neuen Custom Object-Klasse hinzugefügt wurde, wird auch eine Klasse benötigt, die die Erstellung des neuen Objekttyps verwaltet. Diese Klasse muss von CustomObjectFactory abgeleitet sein.

Entwicklung benutzerdefinierter serverseitiger Objektbefehle

CustomObjectFunctions ist die Basisklasse für alle benutzerdefinierten Objektbefehle. Um einen neuen zu entwickeln, muss diese Klasse erweitert und dann die benutzerdefinierte Logik hinzugefügt werden. Es gibt drei Methoden, die in einem neuen benutzerdefinierten Objektbefehl implementiert werden müssen

  • NeedInitialUpdate(ReadOnlyMemory<byte> key, ref ObjectInput input, ref RespMemoryWriter writer)
    Die Methode NeedInitialUpdate bestimmt, ob ein neuer Datensatz basierend auf dem Schlüssel für den Datensatz (key) und der Benutzereingabe (input) erstellt werden muss oder nicht, um den Wert (value) für den neuen Datensatz zu berechnen. Wenn diese Methode true zurückgibt, wird ein neuer Datensatz erstellt, andernfalls nicht.
  • Reader(ReadOnlyMemory<byte> key, ref ObjectInput input, IGarnetObject value, ref RespMemoryWriter writer, ref ReadInfo readInfo);
    Die Methode Reader führt das Lesen eines Datensatzes durch, basierend auf dem Schlüssel für den zu lesenden Datensatz (key) und der Benutzereingabe zur Berechnung der Ausgabe aus value. Die readInfo hilft dabei zu steuern, ob ein Datensatz im Rahmen des Lesevorgangs als abgelaufen markiert werden muss, indem die Option ReadAction verwendet wird. Wenn ein Befehl zum Aktualisieren oder Erstellen/Aktualisieren (Upsert) von Datensätzen gedacht ist, muss diese Methode nicht überschrieben werden, da die Standardimplementierung eine NotImplementedException auslöst.
  • Updater(ReadOnlyMemory<byte> key, ref ObjectInput input, IGarnetObject value, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
    Die Methode Updater führt eine Aktualisierung für RMW oder Upsert durch, basierend auf dem Schlüssel (key), der gegebenen Eingabe (input), dem resultierenden einzufügenden Wert (value), dem Writer, der newValue kopiert (writer), und der Referenz für die Datensatzinformationen dieses Datensatzes (verwendet für Sperren) (rmwInfo). Wenn ein Befehl für einen reinen schreibgeschützten Vorgang gedacht ist, muss diese Methode nicht überschrieben werden, da die Standardimplementierung eine NotImplementedException auslöst.

Es gibt eine optionale Methode, falls erforderlich

  • InitialUpdater(ReadOnlyMemory<byte> key, ref ObjectInput input, IGarnetObject value, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
    Die Methode InitialUpdater kann überschrieben werden, wenn beim erstmaligen Erstellen des Objekts eine spezielle Verarbeitung erforderlich ist. Andernfalls ruft die Standardimplementierung dieser Methode die Methode Updater auf.
Tipp

Als Referenz für die Implementierung eines benutzerdefinierten Objekttyps siehe das Beispiel in GarnetServer\Extensions\MyDictObject.cs. Befehle, die mit diesem Objekt arbeiten, sind in MyDictSet.cs und MyDictGet.cs verfügbar.