服务器端对象扩展
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 中找到。