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 MethodeNeedInitialUpdatebestimmt, 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 MethodeReaderfü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 ausvalue. DiereadInfohilft dabei zu steuern, ob ein Datensatz im Rahmen des Lesevorgangs als abgelaufen markiert werden muss, indem die OptionReadActionverwendet wird. Wenn ein Befehl zum Aktualisieren oder Erstellen/Aktualisieren (Upsert) von Datensätzen gedacht ist, muss diese Methode nicht überschrieben werden, da die Standardimplementierung eineNotImplementedExceptionauslöst.Updater(ReadOnlyMemory<byte> key, ref ObjectInput input, IGarnetObject value, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
Die MethodeUpdaterfü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, dernewValuekopiert (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 eineNotImplementedExceptionauslöst.
Es gibt eine optionale Methode, falls erforderlich
InitialUpdater(ReadOnlyMemory<byte> key, ref ObjectInput input, IGarnetObject value, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
Die MethodeInitialUpdaterkann überschrieben werden, wenn beim erstmaligen Erstellen des Objekts eine spezielle Verarbeitung erforderlich ist. Andernfalls ruft die Standardimplementierung dieser Methode die MethodeUpdaterauf.
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.