golang kv存储引擎
GitHub - k-si/CaskDB: K-V database based on Bitcask, but has some magic changes
跪求star OTZ
Bitcask模型
Bitcask是一个kv存储的模型,它采用日志追加写的模式来记录数据。该模型包含两部分:内存部分和磁盘部分。我们都知道内存的读写速度是非常快的,痛点就是内存的易失性,所以我们必须将数据持久化到磁盘文件中。
如何在磁盘中高效的读写呢?首先想要高效就必须了解磁盘读取数据的方式,传统的机械硬盘中,机械臂移动到目标磁道,然后磁盘旋转,读取该盘面上的数据,数据通过数据总线进入内存。如果要读取的数据是随机散布在硬盘中,需要消耗大量磁臂和磁盘移动时间,所以磁盘的顺序读取速度远远大于随机读取速度。
基于以上,bitcask模型在内存中维护一个map,记录key值和其value值所在文件和文件中的位置等信息,外部读取时,通过内存一次性找到硬盘上的数据。在写入数据时,将数据规整为一条entry,(entry包含keysize、valuesize、key值、value值等)追加写入到文件中。之后更新内存中的map。
当硬盘存储文件过大时,将创建新文件继续追加写,之前的文件将被锁起来,只读不写。为了防止log过多,必须定时合并所有的文件,将数据更新到新的log中。
更多细节,可以google下bitcask论文或其他博文。
介绍
CaskDB是基于Bitcask模型实现的kvdb引擎,支持String,List、Hash、Set、ZSet五种类型数据的持久化存储。它的优势如下:
- 日志结构模型,写入速度快
- 多样数据类型支持
- 键值分离存储,对内存依赖较小
- 性能稳定可预测(只需一次内存和一次磁盘访问)
如果你的内存有限,且性能要求不那么高,可以考虑试试CaskDB。
使用方式
package mainimport ("github.com/k-si/CaskDB""log" )func main() {db, err := CaskDB.Open(CaskDB.DefaultConfig())if err != nil {log.Fatal(err)}defer db.Close()// do something... }
基准测试
测试函数详见:CaskDB/db_str_test.go
1,000,000次读写
go test -bench=BenchmarkDB_Set -benchtime=1000000x -benchmem -run=none goos: darwin goarch: arm64 pkg: github.com/k-si/CaskDB BenchmarkDB_Set-8 1000000 1025 ns/op 520 B/op 10 allocs/op PASS ok github.com/k-si/CaskDB 1.165sgo test -bench=BenchmarkDB_Get -benchtime=1000000x -benchmem -run=none goos: darwin goarch: arm64 pkg: github.com/k-si/CaskDB BenchmarkDB_Get-8 1000000 358.6 ns/op 71 B/op 2 allocs/op PASS ok github.com/k-si/CaskDB 1.516s
5,000,000次读写
go test -bench=BenchmarkDB_Set -benchtime=5000000x -benchmem -run=none goos: darwin goarch: arm64 pkg: github.com/k-si/CaskDB BenchmarkDB_Set-8 5000000 1039 ns/op 520 B/op 11 allocs/op PASS ok github.com/k-si/CaskDB 5.647sgo test -bench=BenchmarkDB_Get -benchtime=5000000x -benchmem -run=none goos: darwin goarch: arm64 pkg: github.com/k-si/CaskDB BenchmarkDB_Get-8 5000000 399.5 ns/op 71 B/op 2 allocs/op PASS ok github.com/k-si/CaskDB 7.457s
10,000,000次读写
go test -bench=BenchmarkDB_Set -benchtime=10000000x -benchmem -run=none goos: darwin goarch: arm64 pkg: github.com/k-si/CaskDB BenchmarkDB_Set-8 10000000 1058 ns/op 520 B/op 11 allocs/op PASS ok github.com/k-si/CaskDB 11.234sgo test -bench=BenchmarkDB_Get -benchtime=10000000x -benchmem -run=none goos: darwin goarch: arm64 pkg: github.com/k-si/CaskDB BenchmarkDB_Get-8 10000000 404.1 ns/op 71 B/op 2 allocs/op PASS ok github.com/k-si/CaskDB 15.463s
其他
CaskDB支持的数据类型和命令操作如下:
String
- Set
- MSet
- SetNx
- MSetNx
- Get
- MGet
- GetSet
- Remove
- SLen
Hash
- HSet
- HSetNx
- HGet
- HGetAll
- HDel
- HLen
- HExist
List
- LPush
- LRPush
- LPop
- LRPop
- LInsert
- LRInsert
- LSet
- LRem
- LLen
- LIndex
- LRange
- LExist
Set
- SAdd
- SRem
- SMove
- SUnion
- SDiff
- SScan
- SCard
- SIsMember
ZSet
- ZAdd
- ZRem
- ZScoreRange
- ZScore
- ZCard
- ZIsMember
- ZTop
golang kv存储引擎相关推荐
- 性能提升2.58倍!阿里最快KV存储引擎揭秘
简介: 阿里云智能数据库Tair团队主要负责自研分布式键值存储(KVS)系统,几乎涵盖了淘宝.天猫.阿里妈妈.菜鸟.钉钉.优酷.高德等阿里巴巴所有核心业务.十多年来,始终如一为阿里业务提供着高可靠.高 ...
- 超级轻量级: KV存储引擎实现
Hi (๑╹◡╹)ノ",各位Gopher本人最近又用Go造了一个轮子,一个超级轻量级KV存储引擎,欢迎
- 基于可持久化内存-AEP的KV存储引擎
基于可持久化内存-AEP的KV存储引擎 一份简单的AEP上手指南 QuicklyStart 切换到测试程序目录 cd ../judge 通过judge程序对KV存储进行一些测试 ** -s :set ...
- 从零实现一个 k-v 存储引擎
写这篇文章的目的,是为了帮助更多的人理解 rosedb,我会从零开始实现一个简单的包含 PUT.GET.DELETE 操作的 k-v 存储引擎. 你可以将其看做是一个简易版本的 rosedb,就叫它 ...
- 基于淘宝开源Tair分布式KV存储引擎的整合部署
一.前言 Tair支撑了淘宝几乎所有系统的缓存信息(Tair = Taobao Pair,Pair即Key-Value键值对),内置了三个存储引擎:mdb(默认,类似于Memcache).rdb(类似 ...
- 基于持久内存的 单机上亿(128B)QPS -- 持久化 k/v 存储引擎
文章目录 性能数据 设计背景 设计架构 Hash 索引结构 及 PMEM空间管理形态 基本API 及 实现 API 初始化流程 写流程 读流程 删除流程 PMEM Allocator设计 主要组件 空 ...
- 存储引擎 boltdb 的设计奥秘?
作者 | 奇伢 来源 | 奇伢云存储 etcd 的存储 etcd v3 是使用的持久化存储来存储它的 kv 数据,etcd 存储的是非常核心的元数据信息,所以最重要的是稳定.使用的是 boltdb ...
- 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别
1. 什么是 KV 存储 KV 是 Key-Value 的缩写,KV 存储也叫键值对存储.简单来说,它是利用 Key 做索引来实现数据的存储.修改.查询和删除功能. 常用的高性能 KV 存储主要有 R ...
- 一个简单的程序来使用WiredTiger 存储引擎
前言 WiredTiger 自 mongodb3.0 集成进来之后为mongodb拉回了大量的口碑,从而在mongodb-3.2 版本直接代替了in-memory存储引擎,作为了mongodb的默认存 ...
最新文章
- android调用h5预加载图片,使用HTML5的页面资源预加载(Link prefetch)功能加速你的页面加载速度...
- FFT镜头效果的新进展
- Caffe Windows版本的编译
- Myeclipse8.5配置本地tomcat
- lisp方格网法计算土方量_CAD土方软件方格网法与三角网法相结合,准确计算土方量...
- HK-2000 数采仪系统说明之 7.HK7710 DTU 简单配置说明
- 【Python】Matplotlib绘制三维散点图
- python查询mysql数据库_用python操作mysql数据库(之简单查询操作)
- 海缆修好之前,上网悠着点
- linux 快速启动程序,centos7快速启动应用程序教程
- Java小项目:坦克大战(二)
- MySQL笔记4——SQL去重/笛卡尔积现象
- 乱码电路(Garbled circuits)
- 基于USB数据采集卡(DAQ)与IO模块的热电阻温度采集
- python豆瓣镜像_pip使用豆瓣的镜像源
- Oracle PL/SQL 编程手册(SQL大全)
- 【案例分享】某银行用这20件事,实现数字化转型
- fatal: not in a git directory(Git)
- uniapp输入框弹起软键盘顶起页面
- 许家印的中秋行程单,恒大造车的“全球化”