跳到主要内容

服务器端对象扩展

Garnet 提供了多种扩展其功能的方式,其中一种是添加您自己的自定义对象实现;类似于 Set、List 或 Sorted Set 提供的功能,但使用您自己的对象类型和 C# 语言的自定义命令功能。

在本文档中,我们将解释如何基于 C# 的 Dictionary 类型实现一个新的对象类型,然后我们将添加一些将使用这个新对象类型的自定义命令。

实现自定义对象

为了添加新的对象类型,您首先需要实现一个继承自 CustomObjectBase 类的类。这个类包含管理 Garnet 中对象基本功能的必要方法。

添加工厂类

一旦添加了新的自定义对象类实现,它还需要一个管理新对象类型创建的类,这个类必须派生自 CustomObjectFactory

开发自定义服务器端对象命令

CustomObjectFunctions 是所有自定义对象命令的基类。要开发新的命令,必须扩展此基类,然后包含自定义逻辑。在一个新的自定义对象命令中需要实现三个方法:

  • NeedInitialUpdate(ReadOnlyMemory<byte> key, ref ObjectInput input, ref RespMemoryWriter writer)
    NeedInitialUpdate 根据记录的键 (key) 和用于计算新记录值 (value) 的用户输入 (input) 来确定是否必须创建新记录。如果此方法返回 true,则创建新记录,否则不创建。
  • Reader(ReadOnlyMemory<byte> key, ref ObjectInput input, IGarnetObject value, ref RespMemoryWriter writer, ref ReadInfo readInfo);
    Reader 方法执行记录读取,给定要读取记录的键 (key),用于从 value 计算输出的用户输入。readInfo 有助于控制是否需要将记录作为读取操作的一部分过期,使用 ReadAction 选项。如果命令旨在更新或 upsert 记录,则无需覆盖此方法,因为默认实现是抛出 NotImplementedException
  • Updater(ReadOnlyMemory<byte> key, ref ObjectInput input, IGarnetObject value, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
    Updater 方法进行 RMW 或 upsert 更新,给定键 (key),给定输入 (input),要插入的结果值 (value),复制 newValue 的写入器 (writer),以及此记录的记录信息(用于锁定)的引用 (rmwInfo)。如果命令旨在纯只读操作,则无需覆盖此方法,因为默认实现是抛出 NotImplementedException

如果需要,还有一个可选方法可用

  • InitialUpdater(ReadOnlyMemory<byte> key, ref ObjectInput input, IGarnetObject value, ref RespMemoryWriter writer, ref RMWInfo rmwInfo)
    如果对象最初创建时需要任何特殊处理,则可以覆盖 InitialUpdater。否则,此方法的默认实现将调用 Updater 方法。
提示

作为自定义对象类型实现的参考,请参阅 GarnetServer\Extensions\MyDictObject.cs 中的示例。操作此对象的命令可在 MyDictSet.cs 和 MyDictGet.cs 中找到。