2025-10-08 16:42:31 +08:00
|
|
|
|
package srdb
|
2025-10-08 06:38:12 +08:00
|
|
|
|
|
|
|
|
|
|
import (
|
2025-10-08 16:42:31 +08:00
|
|
|
|
"slices"
|
2025-10-08 06:38:12 +08:00
|
|
|
|
"sync"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-10-08 16:42:31 +08:00
|
|
|
|
// MemTable 内存表
|
|
|
|
|
|
type MemTable struct {
|
|
|
|
|
|
data map[int64][]byte // key -> value
|
|
|
|
|
|
keys []int64 // 排序的 keys
|
|
|
|
|
|
size int64 // 数据大小
|
|
|
|
|
|
mu sync.RWMutex
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewMemTable 创建 MemTable
|
|
|
|
|
|
func NewMemTable() *MemTable {
|
|
|
|
|
|
return &MemTable{
|
|
|
|
|
|
data: make(map[int64][]byte),
|
|
|
|
|
|
keys: make([]int64, 0),
|
|
|
|
|
|
size: 0,
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Put 插入数据
|
|
|
|
|
|
func (m *MemTable) Put(key int64, value []byte) {
|
|
|
|
|
|
m.mu.Lock()
|
|
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
// 检查是否已存在
|
|
|
|
|
|
if _, exists := m.data[key]; !exists {
|
|
|
|
|
|
m.keys = append(m.keys, key)
|
|
|
|
|
|
// 保持 keys 有序
|
|
|
|
|
|
slices.Sort(m.keys)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m.data[key] = value
|
|
|
|
|
|
m.size += int64(len(value))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Get 查询数据
|
|
|
|
|
|
func (m *MemTable) Get(key int64) ([]byte, bool) {
|
|
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
value, exists := m.data[key]
|
|
|
|
|
|
return value, exists
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Size 获取大小
|
|
|
|
|
|
func (m *MemTable) Size() int64 {
|
|
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
return m.size
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Count 获取条目数量
|
|
|
|
|
|
func (m *MemTable) Count() int {
|
|
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
return len(m.data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Keys 获取所有 keys 的副本(已排序)
|
|
|
|
|
|
func (m *MemTable) Keys() []int64 {
|
|
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
// 返回副本以避免并发问题
|
|
|
|
|
|
keysCopy := make([]int64, len(m.keys))
|
|
|
|
|
|
copy(keysCopy, m.keys)
|
|
|
|
|
|
return keysCopy
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// MemTableIterator 迭代器
|
|
|
|
|
|
type MemTableIterator struct {
|
|
|
|
|
|
mt *MemTable
|
|
|
|
|
|
index int
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewIterator 创建迭代器
|
|
|
|
|
|
func (m *MemTable) NewIterator() *MemTableIterator {
|
|
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
return &MemTableIterator{
|
|
|
|
|
|
mt: m,
|
|
|
|
|
|
index: -1,
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Next 移动到下一个
|
|
|
|
|
|
func (it *MemTableIterator) Next() bool {
|
|
|
|
|
|
it.mt.mu.RLock()
|
|
|
|
|
|
defer it.mt.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
it.index++
|
|
|
|
|
|
return it.index < len(it.mt.keys)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Key 当前 key
|
|
|
|
|
|
func (it *MemTableIterator) Key() int64 {
|
|
|
|
|
|
it.mt.mu.RLock()
|
|
|
|
|
|
defer it.mt.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
if it.index < 0 || it.index >= len(it.mt.keys) {
|
|
|
|
|
|
return 0
|
|
|
|
|
|
}
|
|
|
|
|
|
return it.mt.keys[it.index]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Value 当前 value
|
|
|
|
|
|
func (it *MemTableIterator) Value() []byte {
|
|
|
|
|
|
it.mt.mu.RLock()
|
|
|
|
|
|
defer it.mt.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
if it.index < 0 || it.index >= len(it.mt.keys) {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
key := it.mt.keys[it.index]
|
|
|
|
|
|
return it.mt.data[key]
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Reset 重置迭代器
|
|
|
|
|
|
func (it *MemTableIterator) Reset() {
|
|
|
|
|
|
it.index = -1
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Clear 清空 MemTable
|
|
|
|
|
|
func (m *MemTable) Clear() {
|
|
|
|
|
|
m.mu.Lock()
|
|
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
m.data = make(map[int64][]byte)
|
|
|
|
|
|
m.keys = make([]int64, 0)
|
|
|
|
|
|
m.size = 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-08 06:38:12 +08:00
|
|
|
|
// ImmutableMemTable 不可变的 MemTable
|
|
|
|
|
|
type ImmutableMemTable struct {
|
2025-10-08 16:42:31 +08:00
|
|
|
|
*MemTable
|
2025-10-08 06:38:12 +08:00
|
|
|
|
WALNumber int64 // 对应的 WAL 编号
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-08 16:42:31 +08:00
|
|
|
|
// MemTableManager MemTable 管理器
|
|
|
|
|
|
type MemTableManager struct {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
active *MemTable // Active MemTable (可写)
|
|
|
|
|
|
immutables []*ImmutableMemTable // Immutable MemTables (只读)
|
|
|
|
|
|
activeWAL int64 // Active MemTable 对应的 WAL 编号
|
|
|
|
|
|
maxSize int64 // MemTable 最大大小
|
|
|
|
|
|
mu sync.RWMutex // 读写锁
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-08 16:42:31 +08:00
|
|
|
|
// NewMemTableManager 创建 MemTable 管理器
|
|
|
|
|
|
func NewMemTableManager(maxSize int64) *MemTableManager {
|
|
|
|
|
|
return &MemTableManager{
|
|
|
|
|
|
active: NewMemTable(),
|
2025-10-08 06:38:12 +08:00
|
|
|
|
immutables: make([]*ImmutableMemTable, 0),
|
|
|
|
|
|
maxSize: maxSize,
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// SetActiveWAL 设置 Active MemTable 对应的 WAL 编号
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) SetActiveWAL(walNumber int64) {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.Lock()
|
|
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
m.activeWAL = walNumber
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Put 写入数据到 Active MemTable
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) Put(key int64, value []byte) {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.Lock()
|
|
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
m.active.Put(key, value)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Get 查询数据(先查 Active,再查 Immutables)
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) Get(key int64) ([]byte, bool) {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
// 1. 先查 Active MemTable
|
|
|
|
|
|
if value, found := m.active.Get(key); found {
|
|
|
|
|
|
return value, true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 查 Immutable MemTables(从新到旧)
|
|
|
|
|
|
for i := len(m.immutables) - 1; i >= 0; i-- {
|
|
|
|
|
|
if value, found := m.immutables[i].MemTable.Get(key); found {
|
|
|
|
|
|
return value, true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nil, false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetActiveSize 获取 Active MemTable 大小
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) GetActiveSize() int64 {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
return m.active.Size()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetActiveCount 获取 Active MemTable 条目数
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) GetActiveCount() int {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
return m.active.Count()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ShouldSwitch 检查是否需要切换 MemTable
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) ShouldSwitch() bool {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
return m.active.Size() >= m.maxSize
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Switch 切换 MemTable(Active → Immutable,创建新 Active)
|
|
|
|
|
|
// 返回:旧的 WAL 编号,新的 Active MemTable
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) Switch(newWALNumber int64) (oldWALNumber int64, immutable *ImmutableMemTable) {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.Lock()
|
|
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
// 1. 将 Active 变为 Immutable
|
|
|
|
|
|
immutable = &ImmutableMemTable{
|
|
|
|
|
|
MemTable: m.active,
|
|
|
|
|
|
WALNumber: m.activeWAL,
|
|
|
|
|
|
}
|
|
|
|
|
|
m.immutables = append(m.immutables, immutable)
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 创建新的 Active MemTable
|
2025-10-08 16:42:31 +08:00
|
|
|
|
m.active = NewMemTable()
|
2025-10-08 06:38:12 +08:00
|
|
|
|
oldWALNumber = m.activeWAL
|
|
|
|
|
|
m.activeWAL = newWALNumber
|
|
|
|
|
|
|
|
|
|
|
|
return oldWALNumber, immutable
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// RemoveImmutable 移除指定的 Immutable MemTable
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) RemoveImmutable(target *ImmutableMemTable) {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.Lock()
|
|
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
|
|
|
|
|
|
// 查找并移除
|
|
|
|
|
|
for i, imm := range m.immutables {
|
|
|
|
|
|
if imm == target {
|
|
|
|
|
|
m.immutables = append(m.immutables[:i], m.immutables[i+1:]...)
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetImmutableCount 获取 Immutable MemTable 数量
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) GetImmutableCount() int {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
return len(m.immutables)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetImmutables 获取所有 Immutable MemTables(副本)
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) GetImmutables() []*ImmutableMemTable {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
immutables := make([]*ImmutableMemTable, len(m.immutables))
|
|
|
|
|
|
copy(immutables, m.immutables)
|
|
|
|
|
|
return immutables
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetActive 获取 Active MemTable(用于 Flush 时读取)
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) GetActive() *MemTable {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
return m.active
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TotalCount 获取总条目数(Active + Immutables)
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) TotalCount() int {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
total := m.active.Count()
|
|
|
|
|
|
for _, imm := range m.immutables {
|
|
|
|
|
|
total += imm.MemTable.Count()
|
|
|
|
|
|
}
|
|
|
|
|
|
return total
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TotalSize 获取总大小(Active + Immutables)
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) TotalSize() int64 {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
|
|
|
|
|
total := m.active.Size()
|
|
|
|
|
|
for _, imm := range m.immutables {
|
|
|
|
|
|
total += imm.MemTable.Size()
|
|
|
|
|
|
}
|
|
|
|
|
|
return total
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewIterator 创建 Active MemTable 的迭代器
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) NewIterator() *MemTableIterator {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
return m.active.NewIterator()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-08 16:42:31 +08:00
|
|
|
|
// MemTableStats 统计信息
|
|
|
|
|
|
type MemTableStats struct {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
ActiveSize int64
|
|
|
|
|
|
ActiveCount int
|
|
|
|
|
|
ImmutableCount int
|
|
|
|
|
|
ImmutablesSize int64
|
|
|
|
|
|
ImmutablesTotal int
|
|
|
|
|
|
TotalSize int64
|
|
|
|
|
|
TotalCount int
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetStats 获取统计信息
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) GetStats() *MemTableStats {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.RLock()
|
|
|
|
|
|
defer m.mu.RUnlock()
|
|
|
|
|
|
|
2025-10-08 16:42:31 +08:00
|
|
|
|
stats := &MemTableStats{
|
2025-10-08 06:38:12 +08:00
|
|
|
|
ActiveSize: m.active.Size(),
|
|
|
|
|
|
ActiveCount: m.active.Count(),
|
|
|
|
|
|
ImmutableCount: len(m.immutables),
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for _, imm := range m.immutables {
|
|
|
|
|
|
stats.ImmutablesSize += imm.MemTable.Size()
|
|
|
|
|
|
stats.ImmutablesTotal += imm.MemTable.Count()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
stats.TotalSize = stats.ActiveSize + stats.ImmutablesSize
|
|
|
|
|
|
stats.TotalCount = stats.ActiveCount + stats.ImmutablesTotal
|
|
|
|
|
|
|
|
|
|
|
|
return stats
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Clear 清空所有 MemTables(用于测试)
|
2025-10-08 16:42:31 +08:00
|
|
|
|
func (m *MemTableManager) Clear() {
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.mu.Lock()
|
|
|
|
|
|
defer m.mu.Unlock()
|
|
|
|
|
|
|
2025-10-08 16:42:31 +08:00
|
|
|
|
m.active = NewMemTable()
|
2025-10-08 06:38:12 +08:00
|
|
|
|
m.immutables = make([]*ImmutableMemTable, 0)
|
|
|
|
|
|
}
|