Kyoto Cabinet 实现原理

Kyoto Cabinet高效Key-Value数据库最新版本体验 Kyoto Cabinet自2009年首次发布以来,一直在不断地进化与完善。它的前身是京都大学信息学研究科的教授Falconbridge开发的内嵌式数据库系统,旨在提供轻量级、高性能的存储解决方案。Kyoto Cabinet通过使用B+树索引机制,提供快速的键值对存储与检索,现在已被广泛应用于需要高效数据读写的场景中。Key-Value(键值对)数据库是一种存储、读取数据的NoSQL数据库。与关系型数据库模型不同,它们不使用传统的表格结构存储数据。 阅读详情

       由于最近在做分布式存储系统,需要一个小、性能好、靠谱的存储引擎,我们瞄准了Kyoto Cabinet,希望通过分析源码能对它进行改造成我们需要的引擎,这一工作落在我身上,于是我花了一星期时间彻底地分析了Kyoto Cabinet源码,下面将分享下由Kyoto Cabinet源码分析出的实现原理。

       下面主要分析hashdb和treedb这两种存储结构,其他的要么简单,要么类似,就不分析了。

一、hashdb

      hashdb,顾名思义就是哈希表,只是哈希表存放在文件系统而不是内存,复杂度比存在内存大多了,冲突采用链表或二叉树解决。

      大家对哈希表应该都比较熟悉,它由三要素组成:哈希函数,哈希表和冲突解决方法。在无冲突情况下,查找、插入和更新复杂度为O(1);有冲突情况下的复杂度就视冲突情况来定复杂度了。增加哈希表的桶数,可以减少冲突,但会牺牲空间,所以具体应用时,需要权衡冲突和空间。

     下面分别对上面介绍的三要素是如何hashdb实现的。

(1)哈希函数

      hashdb的哈希函数是采用MurMur算法。具体可以看维基百科的介绍:http://zh.wikipedia.org/wiki/Murmur%E5%93%88%E5%B8%8C,实现函数是hashmurmur,这里就不贴代码了。

(2)哈希表

     hashdb的哈希表是文件系统里一个文件,它的结构由下面图所示:

                                         
                                                      图1 哈希表结构
                                        
                                                图2 bucket section内部结构 
 
                                        
                                               图3 record section内部结构
 
                                        
                                                图4  record 内部结构                                    
                                            
         由图1-图4可知哈希表是如何在文件系统里实现了,其中图1的meta data是哈希表的属性,图4的right address只有冲突方法是二叉树时才有,链表方式不需要。
 
(3)冲突解决方法
          hashdb有两种冲突方案:链表和二叉树,是可选的。冲突较少时用链表好,多时用二叉树。
 
        下面分析下hashdb里较难理解或需注意的技术细节。
(1)碎片整理
        a.  首然找到一个free block
        b.   然后将后面的记录的padding缩小,然后将记录紧凑地前移,在有限步下完成后,会空出一大块空间块
        c.   最后将该大块空间加入free block pool

(2)文件恢复

        触发条件:没有调用close而非正常关闭db。

        恢复思想:遍历旧hashdb文件里的record,然后将合法的record插入新hashdb,最后替换旧文件。

(3)非法close数据库,可能产生数据丢失或数据被认为合法但不正确

         a. 写padding size的时,成功写入第一个字节,写入第二字节失败,可能引起不可回收的文件碎片,或认为该记录不合法;
         b. 写key size或value size写一半,可能引起该记录的边界到了第二个记录上,这就为什么恢复DB时,需要顺利正确能读出两个记录的第一个记录才认为是合法的; 

         c.  写data写一半,只会引起数据不正确;
         d. 写Address写一半,可通过自动恢复dB恢复,而且数据没有丢失或不正确。

(4)Free block pool大小超过最大值时,会有free block无法放入Free block pool,导致该free block无法利用,直到碎片整理到它。

(5)事务

        hashdb是采用预写日志方式来实现事务的,它的事务隔离级别是可序列化的,事务的最高隔离级别,粒度最大。

        日志文件格式如下图所示:

                        
                                              图5 日志格式

 

(6)hashdb的锁粒度是record级别,但又不完全是,它是分配一定数量的锁放到内存级哈希表,通过哈希的方式去获取锁。

 

二、treedb

        treedb的数据结构是采用最小B+树,B+持久化到磁盘方式是采用hashdb,我感觉该持久化方式是比较偷懒的,性能没有直接将B+树保持到磁盘好,因为通过hashdb会产生较多的磁盘IO,但作者为弥补这一点,treedb内部实现了一级lru的index page node cache和二级lru的leaf page node cache来减少读写磁盘。

         treedb主要内部数据结构由下图所示: 

         
                                                  图6  Index node结构
 
          
                                                图7 Link node结构
 
        

                                               图8 Leaf node结构

        
                                              图9 recode结构 

        上面说了,treedb持久化方式是采用hashdb,上图的index node和leaf node对应hashdb的value,key是node id。

        另外,如果不设autsyn,treedb不会该更新立即写入磁盘,而是写在cache里,后面某个时间再刷到磁盘上。

        treedb的锁粒度是node,即page。

       treedb里的lru cache是采用一般的实现方式:哈希表+双向链表。

kyotocabinet源码实例(java版) 立即下载

相关推荐

count-db:用Java编写的快速键值存储,其性能优于levelDB,kyoto cabinet和rocksDB

计数数据库 快速键值存储库(用Java编写),除JSON序列化对象外,该存储库还经过优化以处理原始类型(整数/长整数/双精度数/浮点数)。 用例 如果您需要从Java程序非常有效地写入和读取数十亿个计数,则想使用count-db。 用例是记录大量用户数据,为计数n-gram或建立索引以搜索文本。 如果您需要事务或my-sql样式查询,则不想使用count-db。 表现 我们将count-db与其他3个键值存储的性能进行了比较: , 和 。 count-db的性能优于全部三个,例如,在写入256M bigram计数时,它比levelDB快80倍,而从这些计数中读取时,它比levelDB快11倍。 完整的基准可以在找到。 用法 在您的项目中包括以下Maven依赖项 <dependency> <groupId>be.bagofwords</groupId> <artifact

高性能Nosql数据库Kyoto Cabinet安装笔记

官方网站介绍 http://fallabs.com/kyotocabinet/Kyoto Cabinet是一个key-value数据库管理程序的library ,key和value都可以使二进制或者字符串格式。数据存储存分hash和b+ tree模式。   Kyoto Cabinet非常快,在hash模式下,插入100万数据只要0.9秒,在b+ tree模式下只要1.1秒。查询200万条数据也只需要1秒。并且Kyoto Cabinet的数据文件占用的空间也非常小。Kyoto Cabinet的可伸缩性也是非常

东杰书屋 7893

飞塔防火墙认证绕过漏洞(CVE-2022-40684)深度剖析与实战复现

本文深度剖析了Fortinet飞塔防火墙高危认证绕过漏洞CVE-2022-40684的原理与影响。该漏洞允许攻击者通过构造包含特定Forwarded头和User-Agent的HTTP请求,无需凭证即可绕过认证,以管理员身份访问设备。文章详细演示了从环境搭建到实战复现,最终植入SSH密钥获取控制权的完整过程,并提供了漏洞挖掘技巧与关键防御建议。

d6e7f8g9h的博客 706

Kyoto Cabinet(DBM) + Kyoto Tycoon(网络层)

一. 安装 前注:没使用最新版本,因为最新版本似乎存在环境依赖的bug,编译N多错误,很难通过。 (1)安装kyotocabinet mkdir -p /data0/software/ cd /data0/software/ wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.43.tar.gz tar xvzf

zhwei_87的专栏 1624

网络抓包实战:如何捕获与解析802.1Q VLAN标签报文

在网络通信中,数据包是信息传输的基本单元,而VLAN(虚拟局域网)技术通过在数据链路层插入802.1Q标签,实现了网络流量的逻辑隔离与高效管理。其核心原理是在标准以太网帧头中嵌入4字节的VLAN标识,使交换机能够根据VID(VLAN ID)进行精准转发。掌握VLAN报文的捕获与解析技术,对于网络故障排查、安全审计和性能优化具有重要价值,尤其在需要验证网络隔离策略或诊断Trunk链路异常时。本文聚焦于使用Wireshark工具,结合端口镜像等实操方法,详细演示如何抓取并解读携带802.1Q标签的原始报文,帮助

weixin_33417488的博客 381

WRF中使用ERA5再分析数据

   本人在做一些实例时,需要用到最新的ERA5再分析数据集,其中我下载的是ERA5 hourly data on pressure levels form 1979 to present和ERA5 hourly data on single levels from 1979 to present中的3天数据。 1、注册climate copernicus账号 下载ERA5数据前先要注册其账号 2、选择变量    WRF中对于气象数据的字段有具体的要求, ......

GIS 8166

实现键值对存储(三):Kyoto Cabinet 和LevelDB的架构比较分析

本文是《实现键值对存储》系列译文的第三篇 在本文中,我将会逐组件地把Kyoto Cabinet 和 LevelDB的架构过一遍。目标和本系列第二部分讲的差不多,通过分析现有键值对存储的架构来思考我应该如何建立我自己键值对存储的架构。

搞搞Android 玩玩前端 2277

深入浅出DDR系列(二)--DDR工作原理

学习完了DDR的基本组成和硬件结构原理之后,从整体上了解了DDR的特性和静态图,包括原理、管脚图等。那么本章就要从动态的角度来分析时序结构,包括read/write的整个过程到数据返回发生了什么,其中包括以下内容 DDR是如何完成Read、Write 等的操作 DDR的基本命令 DDR的时序参数 DDR的性能分析 1. DRAM基本组成 对于DRAM,其主要由行和列组成,每一个bit中都是由类似右下图的类晶体管的结构组成,对于sdram的数据,可以通过控制column和row就可以访问sd

奇小葩 3万+

#8 Kyoto Cabinet 源码分析

内存科研小组,最近展开了一次对Kyoto Cabinet 数据库的源码学习 数据库的处理,基于accept + visitor 的回调函数实现。 压缩lib 文件相关lib DB+BasicDB+ProtoDB 转载于:https://www.cnblogs.com/BombeL/p/6801616.html...

weixin_33888907的博客 114

第四章 自定义组件、动画

第三章 自定义组件、动画 (一)自定义View 1.1) onMeasure:对当前View的尺寸进行测量 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) widthMeasureSpec和heightMeasureSpec包含测量模式和尺寸大小 int widthMode = MeasureSpec....

Stay Hungry Stay Foolish 求知若饥 虚心若愚 8130

谈谈人大金仓数据库

人大金仓数据库(Kingbase)是国产自主研发的关系型数据库管理系统,兼容主流数据库语法,支持高并发、高安全性及国产化适配。该数据库提供完整的安装部署方案,包括环境准备、初始化配置和验证流程,并配备专业的数据迁移工具(KDMS)实现从Oracle/MySQL等数据库的平滑迁移。系统提供KStudio等图形化管理工具,支持性能监控、备份恢复等运维功能,同时具备性能调优、高可用架构、分区表管理等高级特性,满足政府、金融等领域的企业级需求。

蜚鸣的博客 2091

Kyoto Cabinet 使用及原理

Kyoto Cabinet 基本规格书 如果你知道 Tokyo Cabinet ,那么就应该知道 Kyoto Cabinet,因为他们都是同一个作者(平林幹雄)开发出来的 Key-Value 数据库。 Kyoto Cabinet:a straightforward implementation of DBM, 主页:http://fallabs.com/kyotocabine...

weixin_30865427的博客 671

Steam游戏服务器攻防全景解读——如何构建游戏级抗DDoS防御体系?

当检测到TCP/UDP混合攻击时,应触发预设的熔断策略:优先保障游戏大厅服务的UDP 27015端口,临时限制匹配系统的TCP连接数。针对Steam游戏服务器特有的UDP 4380端口,需配置协议合规性检查规则:限制数据包长度不超过128字节,强制校验请求来源IP的真实性。Steam游戏服务器的防护需要平衡安全性与玩家体验,通过协议深度解析、智能流量调度和服务端加固的三维防御体系,可构建游戏行业专属的抗DDoS护城河。答:采用弹性防护方案,基础防护带宽保持50Gbps,遭遇攻击时自动扩展至T级清洗能力。

2501_91486804的博客 1452

[转]Kyoto Cabinet 使用及原理

KV数据库Kyoto Cabinet 的使用及原理

heiyeluren的blog(黑夜路人的开源世界) 5867

SCSA,scCATCH,SciBet,SingleR 四种注释方法比较

以下是和四种细胞类型注释方法的详细对比,从。

qq_40256654的博客 1211

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

为什么Kototoro要全量迁移Jetpack Compose:XML阅读器退役背后的架构演进内幕

Kototoro 是一款开源的漫画、小说、视频阅读器应用。它正在进行一场彻底的 Jetpack Compose 全量迁移:传统的 XML 布局、Fragment 阅读器和 ViewBinding 已逐批退役,从首页、详情页到漫画阅读器和视频播放器,整个阅读体验如今全部围绕声明式 UI 构建。这篇文章带你拆解这次架构演进背后的动机、路线图与最终成果。 [![Kototoro 全 Compose 迁

gitblog_00156的博客 312

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

在Ubuntu下安装tokyocabinet数据库

1. tokyo cabinet 数据库简介Tokyo Cabinet 是一个DBM的实现。这里的数据库由一系列key-value对的记录构成。key和value都可以是任意长度的字节序列,既可以是二进制也可以是字符串。这里没有数据类型和数据表的概念。 当做为Hash表数据库使用

hit_kongquan的专栏 1456

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Kyoto tyconn配置

Kyotoconn安装要求   1.Linux2.6 以上版本 2.gcc 4.2以上(不准确) 3.ZLIB 1.2.3以上版本 4.Kyoto Cabinet 1.2.42以上版本   zilb安装 下载ZIB http://www.zlib.net/ zlib-1.2.7.tar.gz tar -xzvf zlib-1.2.7.tar.gz cd zlib-1.2.7

生活是一种态度 4269

Kyoto Tycoon:高性能键值数据库服务器

Kyoto Tycoon:高性能键值数据库服务器 项目介绍 Kyoto Tycoon 是一个基于 Kyoto Cabinet 的高性能网络服务器,专为高并发和高性能设计。它不仅支持内存数据库和持久化数据库,还提供了多种数据库格式(如哈希和树形结构),并且支持可选的压缩功能。Kyoto Tycoon 还内置了 Lua 脚本支持,允许用户在服务器端进行复杂的操作。 项目技术分析 Kyoto Tycoo...

gitblog_00082的博客 490

key-value数据库Kyoto Cabinet笔记

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34336292的博客 177

Kyoto Cabinet库的编译说明

简介       Kyoto Cabinet是一个数据库管理的库,是TokyoCabinet的改进版本。数据库是一个简单的包含记录的数据文件,每个记录是一个键值对(Key/Value),Key和Value都是变长的字节序列。Key和 Value既可以是二进制的,也可以是文本字符串。数据库中的Key必须唯一。数据库既没有表的概念,也不存在数据类型。所有的记录被组织为Hash表或 B+树。 特点

勤能补拙 3340

Kyoto Cabinet 基本规格书

<br />如果你知道 Tokyo Cabinet ,那么就应该知道 Kyoto Cabinet,因为他们都是同一个作者(平林幹雄)开发出来的 Key-Value 数据库。 Kyoto Cabinet:a straightforward implementation of DBM,主页:http://fallabs.com/kyotocabinet/ ,演示文稿:http://www.slideshare.net/estraier/kyotoproducts-5886452 。Tokyo Cabinet:a

tongailing的专栏 1190

kyotocabinet 官网

http://fallabs.com/kyotocabinet/api/index.html http://www.162cm.com/p/tokyotyrant.html#toc58

711
上一篇: [译]Kyoto Cabinet 基本规格书
下一篇: 并发控制与事务隔离
whycold
博客等级 码龄19年 280粉丝 44原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值