说下数据存储

数据落盘是很重要的一个环节。数据库在落盘前都是要先写到日志文件的,防止文件丢失和系统崩溃恢复的。硬盘有个问题那就是慢,所以存储的数据提取一般都是要考虑这个问题的,一般有两个部分一个就是减少读取也就是减少IO,另一个就是需要一些数据结构的设计对数据提取和写入效率有一些保障的。

数据库有个WAL的机制

任何对数据文件的修改,必须先写入日志(log),然后才能写入数据文件(data file)。先写日志是因为担心真正写数据的时候发生崩溃可以补救,内存的数据又没法落地会丢失的。

简单的说下数据的文件

  • 因为从系统到硬盘每层都是缓存的。
  • 还有是写入的数据要读取是要序列化和反序列化的,最简单的比如写入一个文本的文件,在把文件的内容读取出来。但是存储数据肯定不能用这个搞法的写的都是字节码反解析出对应的数据。

  • 还有个问题是什么时候触发这个写盘的动作。批量还好;如果性能有要求的?有个阈值控制写盘的动作。

  • 还有个问题读写盘的时候顺序读写性能是最高的,这里就有个划分的问题

  • 还有就是后期有个合并得操作提高利用率

  • 还有个再提下了分布式文件系统数据分散开来。数据分片、冗余备份?

简单来个demo

因为写盘解析很麻烦这里就说个例子,不实操了。

定义一个简单的表结构

ini 复制代码
自动写入添加一个字段 _status 1个字节
表结构:id 32位
       name 100位
       msg  200位
一条数据最大的位数 1+32+100+200=333个字节       

划分

erlang 复制代码
|数据1|数据2|......
因为有些字段是变长的修改下结构,怎么办?
|数据长度-数据1|数据长度-数据2|......
这里面还有个问题就是你会发现数据提取的时候必须整个块一起提取才能找到数据,那再开辟一块地方记录索引数据
|主键-数据1位置|主键-数据2位置|......
这样已处理完后有个问题数据修改还像修改不了了
->打个删除标记->重新写条数据进去

划分分块

  • 整个文件我们可以拆分成一个一个的小块进行数据处理

简单的安全

为了方式文件的损坏这里可以再数据写入后主动添加有些校验数据CRC、MD5、sha。

数据分片?

数据拆分不同地方+拼接? 另存一份备份?完整的一个备份、切片数据有备份拼接 这里面有个问题份的数据量怎么控制?

相关推荐
踏浪无痕18 小时前
一个 Java 老兵转 Go 后,终于理解了“简单”的力量
后端·程序员·go
汪凝同学要努力18 小时前
依赖注入 - Spring 在 IoC 容器里查找一个 Bean 的不同方式示例
后端
Tony Bai18 小时前
告别“If-Else”地狱:OpenFeature 如何重塑 Go 应用的特性开关管理?
开发语言·后端·golang
leaf9z18 小时前
MySQL8配置文件通用模板
mysql
未来之窗软件服务18 小时前
幽冥大陆(六十五) PHP6.x SSL 文字解密—东方仙盟古法结界
网络·数据库·ssl·加解密·仙盟创梦ide·东方仙盟
云边有个稻草人18 小时前
金仓数据库MongoDB兼容:核心技术支撑国产化替代落地
数据库·mongodb·国产数据库·金仓数据库·kes
几度风雨见丹心18 小时前
sqlite图形化界面建数据库、建表、增删改查、选择.db文件、将sql脚本一键导入,并同步数据、一键导出sql脚本并保存本地.sql文件
数据库·sql·sqlite
代码扳手18 小时前
一次线上事故后的反思:Go 项目中如何构建可靠的单元测试
后端·go
Cache技术分享18 小时前
276. Java Stream API - 使用 flatMap 和 mapMulti 清理数据并转换类型
前端·后端
·云扬·18 小时前
MySQL排序与分组性能优化:从原理到实践
android·mysql·性能优化