KV数据存储:内存篇

简介:

缘起

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

内存篇

定长数据存储

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


本文转自 zhenjing 博客园博客,原文链接:  http://www.cnblogs.com/zhenjing/archive/2012/10/31/KV-memory.html ,如需转载请自行联系原作者


相关文章
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
366 0
|
4月前
|
存储 缓存 中间件
|
22天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
21天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
44 1
|
26天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
28天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
67 1
|
1月前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
36 2
|
1月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
41 4
|
1月前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
1月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储