Zum Hauptinhalt springen

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 Methode GetInitialLength gibt 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 Methode GetLength gibt 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 Methode InitialUpdater fü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 der input-Operation auf value (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 Methode InPlaceUpdater fü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 der input-Operation auf value (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 Methode CopyUpdate führt eine Kopieraktualisierung für RMW durch, gegeben den Schlüssel (key), die gegebene Eingabe zur Berechnung von newValue aus oldValue (input), den zu kopierenden/aktualisierenden vorherigen Wert (oldValue), das zu aktualisierende Ziel (newValue), den Schreiber, der newValue kopiert (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 Methode Reader führt ein Record-Lesen durch, gegeben den Schlüssel für den zu lesenden Record (key), die Benutzereingabe zur Berechnung von writer aus value (input), den Wert des gelesenen Records (value), den Schreiber zur Ausgabe von value (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)
    NeedInitialUpdate bestimmt, 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 der input-Operation kopiert werden soll.
    Hinweis: Wenn diese Methode nicht überschrieben wird, gibt sie standardmäßig true zurück.
  • NeedCopyUpdate(ReadOnlySpan<byte> key, ref RawStringInput input, ReadOnlySpan<byte> oldValue, ref RespMemoryWriter writer)
    NeedCopyUpdate bestimmt, 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 der input-Operation auf oldValue kopiert werden soll.
    Hinweis: Wenn diese Methode nicht überschrieben wird, gibt sie standardmäßig true zurück.

Dies sind die Hilfsmethoden für die Entwicklung benutzerdefinierter Transaktionen.

  • GetNextArg(ref RawStringInput input, scoped ref int offset):
    Die Methode GetNextArg wird 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 Methode GetFirstArg wird 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).