缘起
数据存储实在太重要,打算整理下有关数据存储的相关内容。
内存篇
定长数据存储
1、定长无序;
2、定长有序:1)数据本身有序;2)索引+无序数据。常见数据结构:数组、链表、树、B+树等。
增强约束:内存有序存放(新数据追加写/循环写;老数据直接覆盖)。有序存放数据的内存数据可直接写出到持久化设备,如磁盘、SSD等。
不定长数据
1、有序索引+内存无序存放(new、malloc);
2、有序索引+内存有序存放(预分配空间)。
3、有序索引+内存有序存放+紧凑追加写(更新索引:更新或增加;废弃标识:删除)
常见的空间预分配策略:
1、数组、多阶定长空间(指数、非指数);
2、定长数组+链表;
3、多阶hash(同hash下是否允许存放多个key的数据?影响数据查找结束判断)
空间扩展和数据迁移
对于多阶定长空间分配,数据可不断向高一阶的空间迁移。当记录不断增加,需要限制对高阶空间的长度。不断扩展高阶空间块,可解决数据存储问题,若考虑内存的使用率,还应该考虑如何决定最高阶空间长度、是否增加多个低阶空间块。
紧凑存储
对每一条内存中的数据记录,要实现紧凑存储的关键:可识别的数据记录边界。常见方法:1)记录长度;2)使用唯一的记录终止符(比如文本文件的'\n')。
使用场景的特殊限制:数据量基本不变;只读;可丢数据;定期更新等。以上限制可简化存储设计。
问题:
实现细节:
1)如何保证记录的原子更新?
2)如何保证更新期间的数据有效性?读写高效性?如何实现多读多写?一写多读?
系统通用性:
1) 如何保证数据安全 -- 持久化; 额外问题:故障恢复
2) 如何保证系统的平行扩展 -- 多机存储 -> 引发问题:数据如何分布
3) 如何保证数据可用性 -- 存储多份数据 -> 引发问题:数据的一致性