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存储引擎相关推荐

  1. 性能提升2.58倍!阿里最快KV存储引擎揭秘

    简介: 阿里云智能数据库Tair团队主要负责自研分布式键值存储(KVS)系统,几乎涵盖了淘宝.天猫.阿里妈妈.菜鸟.钉钉.优酷.高德等阿里巴巴所有核心业务.十多年来,始终如一为阿里业务提供着高可靠.高 ...

  2. 超级轻量级: KV存储引擎实现

    Hi (๑╹◡╹)ノ",各位Gopher本人最近又用Go造了一个轮子,一个超级轻量级KV存储引擎,欢迎

  3. 基于可持久化内存-AEP的KV存储引擎

    基于可持久化内存-AEP的KV存储引擎 一份简单的AEP上手指南 QuicklyStart 切换到测试程序目录 cd ../judge 通过judge程序对KV存储进行一些测试 ** -s :set ...

  4. 从零实现一个 k-v 存储引擎

    写这篇文章的目的,是为了帮助更多的人理解 rosedb,我会从零开始实现一个简单的包含 PUT.GET.DELETE 操作的 k-v 存储引擎. 你可以将其看做是一个简易版本的 rosedb,就叫它 ...

  5. 基于淘宝开源Tair分布式KV存储引擎的整合部署

    一.前言 Tair支撑了淘宝几乎所有系统的缓存信息(Tair = Taobao Pair,Pair即Key-Value键值对),内置了三个存储引擎:mdb(默认,类似于Memcache).rdb(类似 ...

  6. 基于持久内存的 单机上亿(128B)QPS -- 持久化 k/v 存储引擎

    文章目录 性能数据 设计背景 设计架构 Hash 索引结构 及 PMEM空间管理形态 基本API 及 实现 API 初始化流程 写流程 读流程 删除流程 PMEM Allocator设计 主要组件 空 ...

  7. 存储引擎 boltdb 的设计奥秘?

    作者 | 奇伢 来源 | 奇伢云存储 etcd 的存储 etcd v3 是使用的持久化存储来存储它的 kv 数据,etcd  存储的是非常核心的元数据信息,所以最重要的是稳定.使用的是 boltdb ...

  8. 常用的高性能 KV 存储 Redis、Memcached、etcd、Zookeeper 区别

    1. 什么是 KV 存储 KV 是 Key-Value 的缩写,KV 存储也叫键值对存储.简单来说,它是利用 Key 做索引来实现数据的存储.修改.查询和删除功能. 常用的高性能 KV 存储主要有 R ...

  9. 一个简单的程序来使用WiredTiger 存储引擎

    前言 WiredTiger 自 mongodb3.0 集成进来之后为mongodb拉回了大量的口碑,从而在mongodb-3.2 版本直接代替了in-memory存储引擎,作为了mongodb的默认存 ...

最新文章

  1. android调用h5预加载图片,使用HTML5的页面资源预加载(Link prefetch)功能加速你的页面加载速度...
  2. FFT镜头效果的新进展
  3. Caffe Windows版本的编译
  4. Myeclipse8.5配置本地tomcat
  5. lisp方格网法计算土方量_CAD土方软件方格网法与三角网法相结合,准确计算土方量...
  6. HK-2000 数采仪系统说明之 7.HK7710 DTU 简单配置说明
  7. 【Python】Matplotlib绘制三维散点图
  8. python查询mysql数据库_用python操作mysql数据库(之简单查询操作)
  9. 海缆修好之前,上网悠着点
  10. linux 快速启动程序,centos7快速启动应用程序教程
  11. Java小项目:坦克大战(二)
  12. MySQL笔记4——SQL去重/笛卡尔积现象
  13. 乱码电路(Garbled circuits)
  14. 基于USB数据采集卡(DAQ)与IO模块的热电阻温度采集
  15. python豆瓣镜像_pip使用豆瓣的镜像源
  16. Oracle PL/SQL 编程手册(SQL大全)
  17. 【案例分享】某银行用这20件事,实现数字化转型
  18. fatal: not in a git directory(Git)
  19. uniapp输入框弹起软键盘顶起页面
  20. 许家印的中秋行程单,恒大造车的“全球化”

热门文章

  1. 20-软通动力信息技术股份有限公司-info
  2. 如何设置过滤器Filter
  3. 华为(HUAWEI)TE10一体化高清视频会议终端系统维护之指示灯状态
  4. Tauri 应用篇 - 系统托盘
  5. 【面经攒人品】蚂蚁金服—反洗钱岗
  6. border-radius理解-边框棱角变圆
  7. 以太网通信(1)UDP —— 数据发送
  8. 高手如何做全网整合营销推广?全网营销方法和策略有哪些?
  9. Linux:删除重复文件工具fdupes
  10. 二、rally使用指导