99 lines
2.7 KiB
C#
99 lines
2.7 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using FASTER.core;
|
|||
|
|
|
|||
|
|
namespace MyFaster
|
|||
|
|
{
|
|||
|
|
public class LengRe
|
|||
|
|
{
|
|||
|
|
public void AAA()
|
|||
|
|
{
|
|||
|
|
// 创建存储设备(混合内存+磁盘)
|
|||
|
|
var logDevice = Devices.CreateLogDevice("colddata.log"); // 冷数据存储到磁盘
|
|||
|
|
var logSettings = new LogSettings
|
|||
|
|
{
|
|||
|
|
LogDevice = logDevice,
|
|||
|
|
MemorySizeBits = 20, // 1MB 内存(热数据区)
|
|||
|
|
PageSizeBits = 16 // 64KB 磁盘页
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 创建 FASTER 实例
|
|||
|
|
var store = new FasterKV<Key, Value>(
|
|||
|
|
size: 1 << 16, // 哈希表大小
|
|||
|
|
logSettings: logSettings
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 创建会话
|
|||
|
|
var session = store.NewSession(new SimpleFunctions<Key, Value>());
|
|||
|
|
|
|||
|
|
// 写入数据(自动处理热/冷数据)
|
|||
|
|
Key key = new Key { Id = 1 };
|
|||
|
|
Value value = new Value { Data = "示例数据", LastAccessed = DateTime.UtcNow };
|
|||
|
|
|
|||
|
|
session.Upsert(ref key, ref value);
|
|||
|
|
|
|||
|
|
// 读取数据(热数据在内存,冷数据从磁盘加载)
|
|||
|
|
Value output = default;
|
|||
|
|
Status status = session.Read(ref key, ref output);
|
|||
|
|
|
|||
|
|
Console.WriteLine($"读取数据: {output.Data}");
|
|||
|
|
Console.WriteLine($"最后访问: {output.LastAccessed}");
|
|||
|
|
|
|||
|
|
// 更新访问时间(保持数据热度)
|
|||
|
|
output.LastAccessed = DateTime.UtcNow;
|
|||
|
|
session.Upsert(ref key, ref output);
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
// 填充测试数据
|
|||
|
|
for (int i = 0; i < 1000; i++)
|
|||
|
|
{
|
|||
|
|
Key k = new Key { Id = i };
|
|||
|
|
Value v = new Value { Data = $"Item-{i}", LastAccessed = DateTime.UtcNow };
|
|||
|
|
session.Upsert(ref k, ref v);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 访问部分数据保持热度
|
|||
|
|
for (int i = 0; i < 10; i++) // 频繁访问前10条
|
|||
|
|
{
|
|||
|
|
Key k = new Key { Id = i };
|
|||
|
|
Value v = default;
|
|||
|
|
session.Read(ref k, ref v);
|
|||
|
|
v.LastAccessed = DateTime.UtcNow;
|
|||
|
|
session.Upsert(ref k, ref v);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 此时:
|
|||
|
|
// - 前10条是热数据(在内存)
|
|||
|
|
// - 其余990条是冷数据(在磁盘)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Read()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public struct Key : IEquatable<Key>
|
|||
|
|
{
|
|||
|
|
public int Id;
|
|||
|
|
public bool Equals(Key other) => Id == other.Id;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public struct Value
|
|||
|
|
{
|
|||
|
|
public string Data;
|
|||
|
|
public DateTime LastAccessed;
|
|||
|
|
}
|
|||
|
|
}
|