代码改变世界

KV数据存储:内存篇

2012-10-31 13:49  zhenjing  阅读(6704)  评论(0编辑  收藏  举报

缘起

数据存储实在太重要,打算整理下有关数据存储的相关内容。

内存篇

定长数据存储

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) 如何保证数据可用性 -- 存储多份数据 -> 引发问题:数据的一致性