You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Geode Native Client API在.NET中创建复合键的C#示例

Apache Geode .NET 客户端复合键实现方案

Geode的.NET客户端要求自定义键类实现IGeodeSerializable接口,同时重写相等判断和哈希计算方法,保证相同field1+field2的实例会被识别为同一个键。


步骤1:实现自定义复合键类

using Apache.Geode.Client;

// 基于field1、field2构建的自定义复合键类
public class MyCompositeKey : IGeodeSerializable
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }

    // 无参构造函数,Geode序列化逻辑要求必须存在
    public MyCompositeKey() { }

    public MyCompositeKey(string field1, string field2)
    {
        Field1 = field1;
        Field2 = field2;
    }

    // 重写相等判断逻辑,仅当两个字段完全一致时判定为相同键
    public override bool Equals(object obj)
    {
        if (obj is MyCompositeKey otherKey)
        {
            return Field1 == otherKey.Field1 && Field2 == otherKey.Field2;
        }
        return false;
    }

    // 重写哈希计算,基于两个参与建键的字段生成哈希值
    public override int GetHashCode()
    {
        // .NET Core 2.1+/NET 5+ 可直接使用HashCode.Combine
        return HashCode.Combine(Field1, Field2);
        
        // 若为.NET Framework环境,替换为以下兼容写法
        // int hash = 17;
        // hash = hash * 23 + (Field1?.GetHashCode() ?? 0);
        // hash = hash * 23 + (Field2?.GetHashCode() ?? 0);
        // return hash;
    }

    // 实现序列化方法,将键字段写入Geode数据流
    public void ToData(DataOutput output)
    {
        output.WriteUTF(Field1);
        output.WriteUTF(Field2);
    }

    // 实现反序列化方法,从Geode数据流读取键字段
    public void FromData(DataInput input)
    {
        Field1 = input.ReadUTF();
        Field2 = input.ReadUTF();
    }

    // 返回对象序列化后占用的字节大小,用于Geode内存估算
    public uint ObjectSize => (uint)(Field1.Length + Field2.Length + 2 * sizeof(ushort));

    // 序列化工厂方法,用于Geode创建键类实例
    public static IGeodeSerializable CreateInstance()
    {
        return new MyCompositeKey();
    }
}

步骤2:注册自定义键类(Geode客户端初始化阶段执行)

// 初始化Geode缓存前完成自定义类型注册,0x0A为自定义类型ID,需保证客户端、服务端配置一致且不与内置类型ID冲突
Serializable.RegisterType(MyCompositeKey.CreateInstance, 0x0A);

步骤3:使用复合键操作数据

// 你的业务数据类定义
public class MyDataObject
{
    public string Field1 { get; set; }
    public string Field2 { get; set; }
    public string Field3 { get; set; }
}

// 写入数据示例
var data = new MyDataObject
{
    Field1 = "biz_id_001",
    Field2 = "partition_003",
    Field3 = "业务数据内容"
};
var key = new MyCompositeKey(data.Field1, data.Field2);
region.Put(key, data); // region为你提前初始化完成的Geode区域实例

// 查询数据示例
var queryKey = new MyCompositeKey("biz_id_001", "partition_003");
var result = region.Get(queryKey); // 可直接命中对应MyDataObject实例

注意事项

  • 复合键类的Field1、Field2作为键字段,写入Geode后不要修改,否则会导致哈希值变化无法正常查询数据
  • 若使用高版本Geode客户端,也可以替换为IPdxSerializable接口实现序列化,适配PDX跨语言序列化场景

内容的提问来源于stack exchange,提问作者Michael Thoresen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:36:01