美文网首页从多线程到分布式
如何设计KV来高效率存储数据

如何设计KV来高效率存储数据

作者: 吟游雪人 | 来源:发表于2023-10-08 19:47 被阅读0次

1.读写形式
通过 mmap 内存映射文件,提供一段可供随时写入的内存块,App 只管往里面写数据,由操作系统负责将内存回写到文件,不必担心 crash 导致数据丢失。

2.存储格式
pb 在性能和空间占用上都有不错的表现。考虑到我们要提供的是通用 kv 组件,key 可以限定是 string 字符串类型,value 则多种多样(int/bool/double 等)。要做到通用的话,考虑将 value 通过 protobuf 协议序列化成统一的内存块(buffer),然后就可以将这些 KV 对象序列化到内存中。

3.写入优化
标准 protobuf 不提供增量更新的能力,每次写入都必须全量写入。考虑到主要使用场景是频繁地进行写入更新,我们需要有增量更新的能力:将增量 kv 对象序列化后,直接 append 到内存末尾;这样同一个 key 会有新旧若干份数据,最新的数据在最后;那么只需在程序启动第一次时,不断用后读入的 value 替换之前的值,就可以保证数据是最新有效的。

4.空间整理
使用 append 实现增量更新带来了一个新的问题,就是不断 append 的话,文件大小会增长得不可控。例如同一个 key 不断更新的话,是可能耗尽几百 M 甚至上 G 空间,而事实上整个 kv 文件就这一个 key,不到 1k 空间就存得下。这明显是不可取的。我们需要在性能和空间上做个折中:以内存 pagesize 为单位申请空间,在空间用尽之前都是 append 模式;当 append 到文件末尾时,进行文件重整、key 排重,尝试序列化保存排重结果;排重后空间还是不够用的话,将文件扩大一倍,直到空间足够。

相关文章

  • 配置中心-Spring Cloud Config

    核心: 基于Git Hook 数据存储KV

  • MMKV--源码学习

    kv数据持久化需要的功能 假设要设计一个kv的存储功能: 首先是可靠性,在各种情况下能够将kv保存 性能的要求,当...

  • 2017 11-15 redis应用

    一.redis介绍 (1)概念:属于非关系型存储数据库——基于kv(键值存储)的开源的内存存储,数据库结构存储。经...

  • Consul-基本概念

    Consul 功能要点 Consul 是为应用提供服务发现和配置的工具(不是专门为kv存储设计,这是与数据库最大的...

  • 浅谈分布式存储系统数据分布方法

    分布式存储系统中面临着的首要问题就是如何将大量的数据分布在不同的存储节点上,无论上层接口是KV存储、对象存储、块存...

  • Redis慌了!腾讯终于对缓存下手了!!

    Tendis是腾讯互娱CROS DBA团队 & 腾讯云数据库团队自主设计和研发的分布式高性能KV存储数据库,兼容R...

  • 浅谈分布式存储系统的数据分布算法

    前言 分布式存储系统 面临着的首要问题,就是如何将 大量的数据 分布在 不同的存储节点 上。无论上层接口是 KV ...

  • 智能合约编写整理

    智能合约最基础的函数GetState(key),PutState(key,bytes),kv方式存储数据; stu...

  • 前后台交互时间存储精确到毫秒

    问题描述 需要存储的时间数据精确到毫秒,数据库字段如何设计,前台如何传参,后台如何接收 数据库表字段设计 mysq...

  • redis基础

    存储(实现)原理数据模型set hello word 为例,因为 Redis 是KV 的数据库,它是通过 hash...

网友评论

    本文标题:如何设计KV来高效率存储数据

    本文链接:https://www.haomeiwen.com/subject/lyfcvdtx.html