如何使用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
相关产品推荐
相关产品推荐

