109 lines
3.8 KiB
C#
109 lines
3.8 KiB
C#
|
|
using System.Diagnostics;
|
|||
|
|
using System.Net;
|
|||
|
|
using FASTER.core;
|
|||
|
|
using MemoryPack;
|
|||
|
|
|
|||
|
|
namespace MyFaster
|
|||
|
|
{
|
|||
|
|
[MemoryPackable()]
|
|||
|
|
public partial class MyData
|
|||
|
|
{
|
|||
|
|
public string? FirstName { get; set; }
|
|||
|
|
public string? LastName { get; set; }
|
|||
|
|
public int Age { get; set; }
|
|||
|
|
public string? DetailData { get; set; }
|
|||
|
|
}
|
|||
|
|
internal class Program
|
|||
|
|
{
|
|||
|
|
public static byte[] Serialize<T>(T obj)
|
|||
|
|
{
|
|||
|
|
return MemoryPackSerializer.Serialize(obj);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static T Deserialize<T>(byte[] data)
|
|||
|
|
{
|
|||
|
|
return MemoryPackSerializer.Deserialize<T>(data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class MyValueSerializer1 : BinaryObjectSerializer<MyData>
|
|||
|
|
{
|
|||
|
|
public override void Serialize(ref MyData value)
|
|||
|
|
{
|
|||
|
|
writer.Write(value.FirstName);
|
|||
|
|
writer.Write(value.LastName);
|
|||
|
|
writer.Write(value.Age);
|
|||
|
|
writer.Write(value.DetailData);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void Deserialize(out MyData value)
|
|||
|
|
{
|
|||
|
|
value = new MyData
|
|||
|
|
{
|
|||
|
|
FirstName = reader.ReadString(),
|
|||
|
|
LastName = reader.ReadString(),
|
|||
|
|
Age = reader.ReadInt32(),
|
|||
|
|
DetailData = reader.ReadString()
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class MyValueSerializer : BinaryObjectSerializer<MyData>
|
|||
|
|
{
|
|||
|
|
public override void Serialize(ref MyData value)
|
|||
|
|
{
|
|||
|
|
//writer.Write(IPAddress.HostToNetworkOrder(Q.Length)); // 4字节长度头
|
|||
|
|
var Q = MemoryPackSerializer.Serialize(value);
|
|||
|
|
writer.Write(Q.Length); // 4字节长度头
|
|||
|
|
writer.Write(Q);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void Deserialize(out MyData value)
|
|||
|
|
{
|
|||
|
|
int length = reader.ReadInt32(); // 读长度头
|
|||
|
|
byte[] buffer = reader.ReadBytes(length); // 读数据体
|
|||
|
|
value = MemoryPackSerializer.Deserialize<MyData>(buffer); // 反序列化
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
static async Task Main(string[] args)
|
|||
|
|
{
|
|||
|
|
using var settings = new FasterKVSettings<string, MyData>()
|
|||
|
|
{
|
|||
|
|
LogDevice = Devices.CreateLogDevice("c:/mytemp/log"), // 元数据日志
|
|||
|
|
ObjectLogDevice = Devices.CreateLogDevice("c:/mytemp/obj"), // 对象数据日志
|
|||
|
|
TryRecoverLatest = true,
|
|||
|
|
ValueSerializer = () => new MyValueSerializer()
|
|||
|
|
};
|
|||
|
|
using var store = new FasterKV<string, MyData>(settings);
|
|||
|
|
using var session = store.NewSession(new SimpleFunctions<string, MyData>());
|
|||
|
|
|
|||
|
|
MyData mydata0 = new MyData() { FirstName = "1", LastName = "fdfdf", DetailData = "detail1" };
|
|||
|
|
MyData mydata1 = new MyData() { FirstName = "1", LastName = "fdfdf", DetailData = "detail1" };
|
|||
|
|
MyData mydata2 = new MyData() { FirstName = "1", LastName = "fdfdf", DetailData = "detail1" };
|
|||
|
|
|
|||
|
|
string mma0 = "a";
|
|||
|
|
string mma1 = "b";
|
|||
|
|
string mma2 = "c";
|
|||
|
|
|
|||
|
|
session.Upsert(ref mma0, ref mydata0);
|
|||
|
|
session.Upsert(ref mma1, ref mydata1);
|
|||
|
|
session.Upsert(ref mma2, ref mydata2);
|
|||
|
|
|
|||
|
|
session.CompletePending(true);
|
|||
|
|
// 创建增量检查点(性能更好)
|
|||
|
|
await store.TakeHybridLogCheckpointAsync(CheckpointType.FoldOver);
|
|||
|
|
|
|||
|
|
// 方法1:完整检查点(推荐)
|
|||
|
|
await store.TakeFullCheckpointAsync(CheckpointType.Snapshot);
|
|||
|
|
|
|||
|
|
//完整检查点
|
|||
|
|
await store.TakeFullCheckpointAsync(CheckpointType.FoldOver);
|
|||
|
|
|
|||
|
|
MyData output = null;
|
|||
|
|
var status = session.Read(ref mma0, ref output);
|
|||
|
|
|
|||
|
|
Console.WriteLine("Hello, World!");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|