Golang - LevelDB是什么?为什么需要K-V存储?
一、介绍
https://github.com/syndtr/goleveldb
LevelDB 是一个由 Google 公司所研发的 K-V 存储嵌入式数据库管理系统编程库,以开源的 BSD 许可证发布。其作为 LSM Tree 的经典实现,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写很多的场景。
二、为什么需要K-V数据库?
K-V 数据库主要用于存取、管理关联性的数组。关联性数组又称映射、字典,是一种抽象的数据结构,其数据对象为一个个的 key-value 数据对,且在整个数据库中每个 key 均是唯一的。
随着近年来互联网的兴起,云计算、大数据应用越来越广泛,对于数据库来说也出现了一些需要面对的新情况:
1)数据量呈指数级增长,存储也开始实现分布式。
2)查询响应时间要求越来越快,需在1秒内完成查询操作。
3)应用一般需要 7 × 24 小时连续运行,因此对稳定性要求越来越高,通常要求数据库支持热备份,并实现故障下快速无缝切换。
4)在某些应用中,写数据比读数据更加频繁,对数据写的速度要求也越来越高。
5)在实际应用中,并不是所有环境下的数据都是完整的结构化数据,非结构化数据普遍存在,因此如何实现对灵活多变的非结构化数据的支持是需要考虑的一个问题。
三、原理
leveldb是根据lsm-tree设计的存储引擎,可以极大的提升写操作的效率。lsm-tree本质上一种存储策略,是一种优化写性能的方法。
它对kv键值对的增删改查操作由随机写改为顺序写,由此来提升写入的性能。
lsm-tree 的核心思路就是在内存中维护一个有序的数据结构(可以是跳表、排序树等等)。当一个写操作进来时,对内存中的数据结构进行修改即可。为了避免此次修改在遇到特殊情况(如宕机、进程崩溃)造成的数据丢失问题,此时会将修改转化为一条日志,将其顺序写入日志文件中,避免数据丢失。
当内存中的数据结构大小超过一定阈值,再将内存中的数据结构持久化到硬盘中,此时的写入也是顺序写。性能自然就上来了。
但其缺点在于查询时如果该键值不在内存中,那么就要去硬盘中查找。而此时针对查找的内容它是分了几个不同的小文件,所以在极端情况下可能要读取多次,从而找到对应key-value对。
四、特点
A、优点:
1)key 与 value 采用字符串形式,且长度没有限制。
2)数据能持久化存储,同时也能将数据缓存到内存,实现快速读取。
3)基于 key 按序存放数据,并且 key 的排序比较函数可以根据用户需求进行定制。
4)支持简易的操作接口 API,如 Put、Get、Delete,并支持批量写入。
5)可以针对数据创建数据内存快照。
6)支持前向、后向的迭代器。
7)采用 Google 的 Snappy 压缩算法对数据进行压缩,以减少存储空间。
8)基本不依赖其他第三方模块,可非常容易地移植到 Windows、Linux、UNIX、Android、iOS。
B、缺点:
1)不是传统的关系数据库,不支持SQL查询与索引。
2)只支持单进程,不支持多进程。
3)不支持多种数据类型。
4)不支持 C/S 的访问模式。用户在应用时,需要自己进行网络服务的封装。
五、为什么leveldb写性能高?
简单来说它就是尽量减少随机写的次数。leveldb首先将数据更新到内存中。当内存中的数据量达到一定阈值,将这部分数据再真正刷新到磁盘文件中。一般来说,顺序写60MB/s,随机写45MB/s。
四、应用场景
LevelDB主要应用于查少写多的场景,如:
1)常见的 Web 场景,可以存储用户的个人信息资料、对文章或博客的评论、邮件等。
2)具体到电子商务领域,可以存储购物车中的商品、产品类别、产品评论。
3)存储整个网页,其将网页的 URL 作为 key,网页的内容作为 value。
4)构建更为复杂的存储系统,如日志系统、缓存、消息队列等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」