存储文件内存映射-MappedFileQueue|学习笔记

简介: 快速学习存储文件内存映射-MappedFileQueue

开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段)存储文件内存映射-MappedFileQueue】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/704/detail/12480


存储文件内存映射-MappedFileQueue

 

内容介绍:

一.存储文件内存映射

二.MappedFileQueue

 

一.存储文件内存映射

存储文件的内存映射。RocketMQ 将消息进行持久化的时候,主要用到了几个目录进行消息的存储,比如 CommitLog 里面每一个文件其实都是存储的消息的源数据,

image.pngConsumerqueue 其实是为了进行消息的检索,这里面存储了相当于消息的索引信息,使用它可以快速找到 CommitLog 中的数据,index 是专门的比如根据消息的属性进行索引时,索引信息在这里面进行存储。

RocketMQ 使用了内存映射技术提高了 IO 访问性能,为了使用内存映射,无论对于 CommitLog、Consumerqueue 以及 indexFile,这三类不同的文件都被设计为固定的长度,当一个文件写满之后再创建另外一个新的文件,以文件名作为第一条消息对应的全局物理偏移量。使用内存映射主要的原因,就是提高 IO 访问的性能。我们会看到 CommitLog、Consumerqueue 以及indexFile,它们都是一些固定大小的文件。

其中 CommitLog 每一个的大小都是1G, Consumerqueue 以主题为文件夹名字,这里面分别设置了消息队列对应的存储文件,每一个都是5.72,对于索引的文件大小都是400兆,这些设置的目的都是为了更好地使用内存映射的技术,提高文件的 IO 访问性能。

分别看一下内存映射相关的一些重要的类。

 

二.MappedFileQueue

image.png

第一个是 MappedFileQueue,这个类相当于 CommitLog 中的一个文件的队列,可以将其当做 CommitLog 的目录。这个类中重要的属性第一个是 storePath,是当前 CommitLog 目录的绝对磁盘路径。第二个 mappedFileSize,是每一个消息存储文件的大小,这个数据默认的是1024M(1G)。这里面还有一个集合CopyOnWriteArrayList<MappedFile> mappedFiles 就是文件的集合。还有一个专门的服务类,该服务类的作用主要是创建 MappedFile,当一个文件写满之后,会使用该服务类创建一个新的文件。这里面还存储了当前刷盘指针(flushedwhere = 0)以及当前数据提交的指针(committedwhere = 0)。这是MappedFileQueue 这个类的一些重要属性。在这个类中提供了很多查找MappedFile 的方法。

image.png比如根据时间进行查找,这叫做 getMappedFileByTime,这个方法提供了以时间查找最后进行操作的MappedFile 的文件。还有根据消息偏移量查找,还有查找最小偏移量,根据查找某一个文件的最小偏移量,还有获取存储文件的最大偏移量以及返回存储文件当前的指针,这些方法都是该类中主要的一些方法。在 RocketMQ 中为了提高文件的 IO 访问性能,用到了内存映射的技术,第一个重要的类就是MappedFileQueue,它对应的是 CommitLog 的文件的队列。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
71 1
|
2月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
2月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
2月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
42 4
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
57 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
2月前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
3月前
|
存储 缓存 Linux
用户态内存映射
【9月更文挑战第20天】内存映射不仅包括物理与虚拟内存间的映射,还涉及将文件内容映射至虚拟内存,使得访问内存即可获取文件数据。mmap 系统调用支持将文件或匿名内存映射到进程的虚拟内存空间,通过多级页表机制实现高效地址转换,并利用 TLB 加速映射过程。TLB 作为页表缓存,存储频繁访问的页表项,显著提升了地址转换速度。
|
2月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
2月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
51 0
|
2月前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
48 0