服务器端原始字符串扩展
自定义原始字符串扩展允许添加操作原始字符串的新函数,并将其注册到 Garnet。然后,可以从任何 Garnet 客户端调用此注册函数,并在 Garnet 服务器上执行。
开发自定义服务器端原始字符串扩展
CustomRawStringFunctions
是所有自定义原始字符串函数的基类。要开发新函数,必须扩展此基类,然后包含自定义逻辑。在一个新的自定义原始字符串函数中,有六种方法需要实现:
GetInitialLength(ref RawStringInput input)
:
GetInitialLength
方法返回使用给定输入通过 RMW 填充时值的初始预期长度。GetLength(ReadOnlySpan<byte> value, ref RawStringInput input)
GetLength
方法返回使用给定输入执行值的 RMW 修改时结果值对象的长度。InitialUpdater(ReadOnlySpan<byte> key, ref RawStringInput input, Span<byte> value, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
InitialUpdater
方法执行 RMW 的初始更新,给定键 (key
)、给定输入 (input
)、要插入的结果值 (value
)、用于输出input
操作在value
上的结果的写入器 (writer
) 以及此记录的记录信息引用(用于锁定) (rmwInfo
)。InPlaceUpdater(ReadOnlySpan<byte> key, ref RawStringInput input, Span<byte> value, ref int valueLength, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
InPlaceUpdater
方法执行 RMW 的原地更新,给定键 (key
)、用于计算更新值的给定输入 (input
)、要更新的目标 (value
)、用于输出input
操作在value
上的结果的写入器 (writer
) 以及此记录的记录信息引用(用于锁定) (rmwInfo
)。CopyUpdater(ReadOnlySpan<byte> key, ref RawStringInput input, ReadOnlySpan<byte> oldValue, Span<byte> newValue, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
CopyUpdate
方法执行 RMW 的复制更新,给定键 (key
)、用于从oldValue
计算newValue
的给定输入 (input
)、要复制/更新的先前值 (oldValue
)、要更新的目标 (newValue
)、复制newValue
的写入器 (writer
) 以及此记录的记录信息引用(用于锁定) (rmwInfo
)。Reader(ReadOnlySpan<byte> key, ref RawStringInput input, ReadOnlySpan<byte> value, ref RespMemoryWriter writer, ref ReadInfo readInfo);
Reader
方法执行记录读取,给定要读取记录的键 (key
)、用于从value
计算writer
的用户输入 (input
)、正在读取记录的值 (value
)、用于输出value
的写入器 (writer
) 以及此记录的记录信息引用(用于锁定) (rmwInfo
)。
还有两个可选方法需要实现:
NeedInitialUpdate(ReadOnlySpan<byte> key, ref RawStringInput input, ref RespMemoryWriter writer)
NeedInitialUpdate
确定是否应调用 RMW 的复制更新,给定记录的键 (key
)、用于计算更新值的用户输入 (value
) 以及要复制input
操作结果的位置。
注意: 如果此方法未被重写,则默认返回true
。NeedCopyUpdate(ReadOnlySpan<byte> key, ref RawStringInput input, ReadOnlySpan<byte> oldValue, ref RespMemoryWriter writer)
NeedCopyUpdate
确定是否应调用 RMW 的复制更新,给定记录的键 (key
)、用于计算更新值的用户输入 (value
)、要复制的现有值 (oldValue
) 以及要复制input
操作在oldValue
上的结果的位置。
注意: 如果此方法未被重写,则默认返回true
。
这些是开发自定义事务的辅助方法。
GetNextArg(ref RawStringInput input, scoped ref int offset)
:
GetNextArg
方法用于在指定偏移量处从输入中检索下一个参数。它接受表示输入的 ArgSlice 参数和 int 偏移量的引用。它返回表示参数作为跨度的 ArgSlice 对象。该方法内部读取带有长度标头的指针以提取参数。GetFirstArg(ref RawStringInput input)
:
GetFirseArg
方法用于在偏移量 0 处从输入中检索参数。
通过在 Garnet 服务器对象的 RegisterAPI
对象上调用 NewCommand(string name, int numParams, CommandType type, CustomRawStringFunctions customFunctions, long expirationTicks = 0)
方法来注册自定义原始字符串函数,并提供其名称、参数数量、CommandType(Read / ReadModifyWrite)、自定义原始字符串函数类的实例,以及可选的过期时间(以 tick 为单位)。
也可以从客户端注册自定义原始字符串函数(作为管理命令,假设代码已经驻留在服务器上),方法是使用 REGISTERCS
命令(请参阅自定义命令)。