Server-seitige Roh-String-Erweiterungen
Benutzerdefinierte Roh-String-Erweiterungen ermöglichen das Hinzufügen neuer Funktionen, die auf Roh-Strings operieren, und deren Registrierung bei Garnet. Diese registrierte Funktion kann dann von jedem Garnet-Client aufgerufen und auf dem Garnet-Server ausgeführt werden.
Entwicklung benutzerdefinierter serverseitiger Roh-String-Erweiterungen
CustomRawStringFunctions ist die Basisklasse für alle benutzerdefinierten Roh-String-Funktionen. Um eine neue zu entwickeln, muss diese Klasse erweitert und dann die benutzerdefinierte Logik integriert werden. Es gibt sechs Methoden, die in einer neuen benutzerdefinierten Roh-String-Funktion implementiert werden müssen.
GetInitialLength(ref RawStringInput input):
Die MethodeGetInitialLengthgibt die erwartete Anfangslänge des Werts zurück, wenn dieser durch RMW unter Verwendung der gegebenen Eingabe bevölkert wird.GetLength(ReadOnlySpan<byte> value, ref RawStringInput input)
Die MethodeGetLengthgibt die Länge des resultierenden Wertobjekts zurück, wenn eine RMW-Modifikation des Werts unter Verwendung der gegebenen Eingabe durchgeführt wird.InitialUpdater(ReadOnlySpan<byte> key, ref RawStringInput input, Span<byte> value, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
Die MethodeInitialUpdaterführt eine anfängliche Aktualisierung für RMW durch, gegeben den Schlüssel (key), die gegebene Eingabe (input), den zu einzufügenden Ergebniswert (value), den Schreiber zur Ausgabe des Ergebnisses derinput-Operation aufvalue(writer) und die Referenz für die Record-Informationen für diesen Record (für Sperren verwendet) (rmwInfo).InPlaceUpdater(ReadOnlySpan<byte> key, ref RawStringInput input, Span<byte> value, ref int valueLength, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
Die MethodeInPlaceUpdaterführt eine In-Place-Aktualisierung für RMW durch, gegeben den Schlüssel (key), die gegebene Eingabe zur Berechnung des aktualisierten Werts (input), das zu aktualisierende Ziel (value), den Schreiber zur Ausgabe des Ergebnisses derinput-Operation aufvalue(writer) und die Position, an der.CopyUpdater(ReadOnlySpan<byte> key, ref RawStringInput input, ReadOnlySpan<byte> oldValue, Span<byte> newValue, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
Die MethodeCopyUpdateführt eine Kopieraktualisierung für RMW durch, gegeben den Schlüssel (key), die gegebene Eingabe zur Berechnung vonnewValueausoldValue(input), den zu kopierenden/aktualisierenden vorherigen Wert (oldValue), das zu aktualisierende Ziel (newValue), den Schreiber, dernewValuekopiert (writer), und die Referenz für die Record-Informationen für diesen Record (für Sperren verwendet) (rmwInfo).Reader(ReadOnlySpan<byte> key, ref RawStringInput input, ReadOnlySpan<byte> value, ref RespMemoryWriter writer, ref ReadInfo readInfo);
Die MethodeReaderführt ein Record-Lesen durch, gegeben den Schlüssel für den zu lesenden Record (key), die Benutzereingabe zur Berechnung vonwriterausvalue(input), den Wert des gelesenen Records (value), den Schreiber zur Ausgabe vonvalue(writer) und die Referenz für die Record-Informationen für diesen Record (für Sperren verwendet) (rmwInfo).
Es gibt zwei weitere optionale Methoden, die implementiert werden können.
NeedInitialUpdate(ReadOnlySpan<byte> key, ref RawStringInput input, ref RespMemoryWriter writer)
NeedInitialUpdatebestimmt, ob ein Kopier-Update für RMW aufgerufen werden soll, gegeben den Schlüssel für den Record (key), die Benutzereingabe zur Berechnung des aktualisierten Werts (value) und die Position, an die das Ergebnis derinput-Operation kopiert werden soll.
Hinweis: Wenn diese Methode nicht überschrieben wird, gibt sie standardmäßigtruezurück.NeedCopyUpdate(ReadOnlySpan<byte> key, ref RawStringInput input, ReadOnlySpan<byte> oldValue, ref RespMemoryWriter writer)
NeedCopyUpdatebestimmt, ob ein Kopier-Update für RMW aufgerufen werden soll, gegeben den Schlüssel für den Record (key), die Benutzereingabe zur Berechnung des aktualisierten Werts (value), den vorhandenen Wert, der kopiert würde (oldValue), und die Position, an die das Ergebnis derinput-Operation aufoldValuekopiert werden soll.
Hinweis: Wenn diese Methode nicht überschrieben wird, gibt sie standardmäßigtruezurück.
Dies sind die Hilfsmethoden für die Entwicklung benutzerdefinierter Transaktionen.
GetNextArg(ref RawStringInput input, scoped ref int offset):
Die MethodeGetNextArgwird verwendet, um das nächste Argument aus der Eingabe am angegebenen Offset abzurufen. Sie nimmt einen ArgSlice-Parameter, der die Eingabe repräsentiert, und eine Referenz auf einen int-Offset. Sie gibt ein ArgSlice-Objekt zurück, das das Argument als Span repräsentiert. Die Methode liest intern einen Zeiger mit einer Längenüberschrift, um das Argument zu extrahieren.GetFirstArg(ref RawStringInput input):
Die MethodeGetFirstArgwird verwendet, um das Argument aus der Eingabe am Offset 0 abzurufen.
Die Registrierung der benutzerdefinierten Roh-String-Funktion erfolgt serverseitig durch Aufruf der Methode NewCommand(string name, int numParams, CommandType type, CustomRawStringFunctions customFunctions, long expirationTicks = 0) auf dem RegisterAPI-Objekt des Garnet-Serverobjekts mit seinem Namen, der Anzahl der Parameter, dem CommandType (Read / ReadModifyWrite), einer Instanz der benutzerdefinierten Roh-String-Funktionsklasse und optional der Anzahl der Ticks für die Ablaufzeit.
Es ist auch möglich, die benutzerdefinierte Roh-String-Funktion clientseitig zu registrieren (als Admin-Befehl, vorausgesetzt, der Code befindet sich bereits auf dem Server), indem der Befehl REGISTERCS verwendet wird (siehe Benutzerdefinierte Befehle).