首页 > 系统相关 >内存和磁盘设计

内存和磁盘设计

时间:2024-06-10 12:54:35浏览次数:22  
标签:return func Item 内存 key 设计 磁盘 byte btree

内存设计

根据之前论文之中所写,我们在内存中需要存储一份key所对应value的映射位置便于以后读出,在内存中存储的数据结构有许多,例如hash、跳表和b tree等。 在教程中我们使用的是b tree便于以后很方便的遍历key。
数据结构的话直接拿现成的包直接用就行了
btree库: https://github.com/google/btree

首先定义一个数据结构用于表示key存储在文件的位置信息

// LogRecordPos 数据内存索引信息 主要是根据key找到指定文件的指定位置读取指定数据
type LogRecordPos struct {
	FileId uint32 // 文件id
	Pos    int64  // 数据偏移
}

然后根据面向对象的思想定义一个接口,该接口用于操作内存索引,如果之后需要实现其他数据结构,直接实现该接口就行了。

type Indexer interface {
	Put(key []byte, pos *data.LogRecordPos) bool // 设置值
	Get(key []byte) *data.LogRecordPos           // 获取数据的位置信息
	Delete(key []byte) bool                      // 删除kv数据
}

// Item 表示 btree中的数据结构,需要实现了该type才能在Btree中添加数据
type Item struct {
	key []byte
	pos *data.LogRecordPos
}

func (item *Item) Less(than btree.Item) bool {
	// (*Item).key表示断言 如果than实现了btree.Item那么就转换成Item
	return bytes.Compare(item.key, than.(*Item).key) == -1
}

采用Btree数据结构实现了Indexer接口

type Btree struct {
	tree *btree.BTree
	lock *sync.RWMutex
}

func NewBtree() *Btree {
	return &Btree{
		tree: btree.New(64),
		lock: new(sync.RWMutex),
	}
}

func (btree *Btree) Put(key []byte, pos *data.LogRecordPos) bool {
	btree.lock.Lock()
	item := &Item{
		key: key,
		pos: pos,
	}
	btree.tree.ReplaceOrInsert(item)
	btree.lock.Unlock()

	return true
}

func (btree *Btree) Get(key []byte) *data.LogRecordPos {
	item := &Item{key: key}
	getItem := btree.tree.Get(item)

	if getItem == nil {
		return nil
	}

	return getItem.(*Item).pos
}

func (btree *Btree) 	Delete(key []byte) bool {
	btree.lock.Lock()

	item := &Item{
		key: key,
	}
	btree.tree.Delete(item)

	btree.lock.Unlock()

	return true
}

磁盘

磁盘一样使用一个抽象的接口,如果以后需要实现自己的文件引擎直接实现该接口就行。

type IOManagement interface {
	// Read 文件读取 读取的内容会存储到buffer中并返回读取字节数
	Read(offset int64, buffer []byte) (int, error)
	// Write 写数据到文件中 buffer表示写入内容 返回写入字节数
	Write(buffer []byte) (int, error)

	// Sync 将缓存区内容同步到文件中
	Sync() error

	// Close 关闭文件
	Close() error
}

使用最简单的go的库文件即可。


type FileIO struct {
	file *os.File
}

func CreateFileIo(filePath string) (*FileIO, error) {
	file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
	if err != nil {
		return nil, err
	}

	return &FileIO{
		file: file,
	}, nil
}

func (fileIo *FileIO) Read(offset int64, buffer []byte) (int, error) {
	_, err := fileIo.file.Seek(offset, 0)
	if err != nil {
		return 0, err
	}

	return fileIo.file.Read(buffer)
}

func (fileIo *FileIO) Write(buffer []byte) (int, error) {
	return fileIo.file.Write(buffer)
}

func (fileIo *FileIO) Sync() error {
	return fileIo.file.Sync()
}

func (fileIo *FileIO) Close() error {
	return fileIo.file.Close()
}

标签:return,func,Item,内存,key,设计,磁盘,byte,btree
From: https://www.cnblogs.com/lyraHeartstrings/p/18239632

相关文章

  • 深入理解 C++ 动态内存管理:new vs malloc
    概述new/delete 是C++的关键字,需要编译器支持。malloc/free 是库函数,需要头文件支持。使用 new 申请内存分配时无需指定内存块大小,编译器会自动计算。而 malloc 需要明确指定所需内存的大小。new 会返回对象类型的指针,类型安全。而 malloc 返回 void*,需要进行强制......
  • CorelDRAW2024注册码激活码分享,设计师的首选神器!
    【CorelDRAWGraphicsSuite2024】是一款集图形设计、照片编辑和矢量动画于一体的全面图形套件。这款软件因其用户友好的界面、强大的功能集以及支持多种文件格式而广受专业人士和业余爱好者的欢迎。它提供了创新的设计工具,如高级向量插图、页面布局、照片编辑等,旨在提升设计效......
  • Multisim555定时器电路设计仿真
       最近在完成数电课设,需要用到555定时器产生一个秒脉冲,虽然网上有很多关于555的资料,但是按照他们的进行仿真波形一直不对。自己设计的占空比有不太准确,但是其实Multisim有提供555定时器电路设计向导,填好参数会自动生成电路。下面是仿真步骤:电路的R1和R2有参数要求,需要......
  • CorelDRAW2021破解精简版,平面设计神器来袭!
    CorelDRAW平面设计软件2021精简版,是一款让设计师们为之疯狂的工具!作为一名专业的软件评测师,我对它的功能和性能进行了全面的了解和体验。让我来为大家详细介绍一下这款软件的新特性和对设计师工作流程的影响吧!「CorelDRAW全系列汉化版下载」,来自夸克网盘分享链接:抓紧保存以防......
  • 超级实用的设计工具CorelDRAW平面设计软件2021精简版下载
    嘿,小伙伴们!今天我要给大家种草一款超级实用的设计工具——CorelDRAW平面设计软件2021精简版!✨这款软件不仅功能强大,而且操作简便,简直是设计师和学生们的福音啊!......
  • 数据仓库核心:事实表深度解析与设计指南
    文章目录1.引言1.1基本概念1.2事实表定义2.设计原则2.1原则一:全面覆盖业务相关事实2.2原则二:精选与业务过程紧密相关的事实2.3原则三:拆分不可加事实为可加度量2.4原则四:明确声明事实表的粒度2.5原则五:避免同一事实表中存在不同粒度的事实2.6原则六:统一事实的......
  • 避免 OOMKilled:在 Kubernetes 环境中优化 Java 进程的内存配置
    避免OOMKilled:在Kubernetes环境中优化Java进程的内存配置DevOps云学堂译 奇妙的Linux世界 2024-06-1009:53 重庆 听全文公众号关注 「奇妙的Linux世界」设为「星标」,每天带你玩转Linux! 管理KubernetesPod中运行的Java进程的内存使用情况比人们想象......
  • C++Primer Plus 第12章 类和动态内存分配 12.10编程练习第1题new,delete的指向深度拷
    C++PrimerPlus第12章类和动态内存分配12.10编程练习第1题`提示:练习一定要动手操作涉及标准函数及关键词1,new[],delete[],strlen(),strcpy_s(),cout,endl,explicit例如:1,对于下面的类的声明:`提示:设计数组和字符串的new,delete文章目录C++PrimerPlus第12章类......
  • 设计模式之命令模式
    文章目录概述原理命令模式实现其他案例命令模式优缺点小结概述先来个定义,如下:命令模式(commandpattern)的定义:命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、......
  • Springboot计算机毕业设计饮品点单系统小程序【附源码】开题+论文+mysql+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着消费模式的转变和移动互联网的普及,饮品行业面临着巨大的发展机遇。传统的饮品点单方式往往效率低下,且无法满足消费者对个性化、便捷性服务的需求......