Berkeley DB中Btree、Queue、Recno记录编号的说明及应用实例

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

在Berkeley DB中Btree、Queue、Recno算法可以记录编号。编号基于1,不基于0。也就是说,数据库里的第一个记录是从1开始。 可以通过调用DB->get和DBcursor->c_get函数,参数指定为DB_SET_RECNO,关键字DBT的数据区一定是一个db_recno_t类型的指针,这种类型在Berkeley DB包含的头文件中声明。 关键字DBT的大小就是类型大小(用C来表示就是sizeof(db_recno_t))。db_recno_t 类型是32位的无符号整型数,这表明了数据库对记录数的限制最大到4,294,967,295。 在Recno算法中记录号可以是可变或者不变:可变,指的是当记录被删除或者插入时,编号改变;不变,指的是不管数据库如何操作,编号都不改变。在Queue算法中编号总被不变的。在Btree算法中编号总是可变的,并且当记录被删除或者插入时,数据库里的其他记录的编号也可能会改变。 更多的信息请参阅重新编号的记录。 当在Queue下增加新数据时,当达到最大编号时,新加的记录编号将被赋1。此时将返回系统错误EFBIG。Recno在达到最大编号时,就不能再加入新的数据了。 配置Btree类数据库支持记录编号会严重影响多个并发线程对数据库的写操作, 因为储存记录计数的位置被这些线程经常性的调用。Btree的复制数据项,记录编号指向一个关键字和它所有的数据项,数据项没有单独的编号。 下面的例子是一个Recno数据库的读写操作。 函数使用了游标遍历了整个数据库,显示每条记录。

int recno_build(dbp) DB *dbp; { DBC *dbcp; DBT key, data; db_recno_t recno; u_int32_t len; int ret; char buf[1024]; /* 向数据库插入一条记录 */ memset(&key, 0, sizeof(DBT)); memset(&data, 0, sizeof(DBT)); for (recno = 1;; ++recno) { printf("record #%lu> ", (u_long)recno); fflush(stdout); if (fgets(buf, sizeof(buf), stdin) == NULL) break; if ((len = strlen(buf)) <= 1) continue; key.data = &recno; key.size = sizeof(recno); data.data = buf; data.size = len - 1; switch (ret = dbp->put(dbp, NULL, &key, &data, 0)) { case 0: break; default: dbp->err(dbp, ret, "DB->put"); break; } } printf("/n"); /* 取得游标 */ if ((ret = dbp->cursor(dbp, NULL, &dbcp, 0)) != 0) { dbp->err(dbp, ret, "DB->cursor"); return (1); } /* 重新初始化 key/data */ memset(&key, 0, sizeof(key)); memset(&data, 0, sizeof(data)); /* 遍历整个数据库并且打印出key/data */ while ((ret = dbcp->c_get(dbcp, &key, &data, DB_NEXT)) == 0) printf("%lu : %.*s/n", *(u_long *)key.data, (int)data.size, (char *)data.data); if (ret != DB_NOTFOUND) dbp->err(dbp, ret, "DBcursor->get"); /* 关闭游标 */ if ((ret = dbcp->c_close(dbcp)) != 0) { dbp->err(dbp, ret, "DBcursor->close"); return (1); } return (0); }

Berkeley DB 源代码分析 (3) --- Btree的实现 (2) __bam_ditem In btree we store on-page duplicate key/data pairs this way: 1. we only put the key onto the page once, since it's duplicated, there is no meaning putting identical keys multiple tim 阅读详情

相关推荐

Berkeley db 数据库

简介 它是由sleepcat开发,后被oracle收购,并提升了它在数据库行业中的知名度。 Berkeley DB (DB)是一个高性能的,嵌入数据库编程库,和C语言,C++,Java,Perl,Python,PHP,Tcl以及其他很多语言都有绑定。Berkeley DB可以保存任意类型的键/值对,而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支

zhaojinjia的专栏 7913

MySql生成记录编号 RecNo

在使用Mysql 时,时常需要生成记录编号,此方法适用于Mysql8.0及以上版本。sqlite 请参考。

志超的专栏 495

【Unity报错】Unity导入海康SDK 报错 DllNotFoundException: PlayCtrl assembly

2.尝试按网上其他的办法(包括使用depengs查看dll依赖等)1.先检查Plugins文件夹中是否存在PlayCtrl文件。3.如果网上查阅的办法都不能解决,请继续往下看。更换低版本的SDK库文件。

weixin_42968584的博客 1099

[转]Berkeley DB介绍及主从复制机制

Berkeley DB(BDB)是一个高性能的嵌入式数据库编程库(引擎),它可以用来保存任意类型的键/值对 (Key/Value Pair),而且可以为一个键保存多个数据。Berkeley DB可以支持数千的并发线程同时操作数据库,支持最大256TB的数据。

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

封装BerkeleyDB 2.0

''' 对BerkeleyDB DB_QUEUEDB_Recno数据结构的封装 用于优化与提高代码效率 ''' class BDBQueue(object): """docstring for Bqueue""" def __init__(self,dbFile=None,cachefilename=None): #创建DB home = C["DB_PATH"] self

SteveRocket's-Blog 448

Berkeley dbqueue算法的使用(c语言实现)

queue方式的数据库初始大小4K多。以数据段长度为16个字节计,1000条记录为24K,2000条数据为45K,存储效率还可以。其它诸如稳定性还没有测试过。 queue算法的使用代码如下,如果想了解函数的功能,请进入Berkeley db目录下docs/ref/am/ops.html查看函数手册,在此不再赘述 #include "db.h" #include #include #

yaoweibin的专栏 2519

Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)...

Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)。在创建数据库的时候,必须通过dbtype参数将存储结构指定为上述结构中的一种,一旦数据库文件已创建则不能再更改其结构。 结构描述 BTree...

djph26741的博客 365

Berkeley DBBtreeQueueRecno记录主键编号说明

Berkeley DBBtreeQueueRecno记录主键编号说明 2008-06-02 16:41 在Berkeley DBBtreeQueueRecno算法可以记录编号编号基于1,不...

cooy99581908的博客 190

基础

0:Berkeley DB的子系统 1:存取管理子系统 为数据库创建和读写提供支持,它不包含事务 2:内存池管理子系统 对DB使用的共享缓冲区进行管理, 3:事务子系统 提供事务管理功能 4:锁子系统 存取管理子系统用锁子系统同步对数据库的读写,事务子系统通过锁子系统实现多个事务的并发控制 5:日志子系统 用来支持事务子系统对数据的恢复,保证数据的一致性   应用程序直接调

不积跬步 无以至千里 1040

python模块之bsddb: bdb高性能嵌入式数据库 1.基础知识

    bsddb模块是用来操作bdb的模块,bdb是著名的Berkeley DB,它的性能非常好,mysql的存储后端引擎都支持bdb的方式。这里简单介绍一些关于bsddb的使用方法。    bdb不同于一般的关系数据库,它存储的数据只能是以key和value组成的一对数据,使用就像python的字典一样,它不能直接表示多个字段,当要存储多个字段的数据时,只能把数据作为一个整体存放到value中

zhaowei的专栏 1万+

DB数据访问算法

数据库领域中,数据访问算法对应了数据在硬盘上的存储格式和操作方法。在编写应用程序时,选择合适的算法可能会在运算速度上提高1个甚至多个数量级。大多数数据库都选用B+树算法DB也不例外,同时还支持HASH算法Recno算法Queue算法。接下来,我们将讨论这些算法的特点以及如何根据需要存储数据的特点进行选择。 B+树算法:B+树是一个平衡树,关键字有序存储,并且其结构能随数据的插入和删除...

@2014 435

Berkeley db使用方法简介(c接口)

<br />1. 打开数据库<br />首先必须调用db_create()函数初始化DB句柄,然后就可以使用open()方法打开数据库了。默认情况下,如果数据库不存在,DB不会创建。为了覆盖缺省行为,可以在open()调用中指定DB_CREATE标记。<br />以下代码示范了如何打开数据库:<br />#include <db.h> <br />...<br />DB *dbp;           /* DB structure handle */<br />u_int32_t flags;   /*

xiaofei0859的专栏 3517

Python中的Berkeley DB(2):数据结构

Python中的Berkeley DB(2):数据结构Berkeley DB的数据存储结构BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)。在创建数据库的时候,必须通过dbtype参数将存储结构指定为上述结构中的一种,一旦数据库文件已创建则不能再更改其结构。 结

程序设计与安全 @EVAN-CSS 1637

Berkeley DB Hash、BtreeQueueRecno对比和选择

记录号不是用于数据存取的主键时,应该使用 Hash和Btree算法Btree支持对数据查询、插入、删除的常数级速度。关键字可以为任意的数据结构。 因此,当在主键有序时,Btree算法应该被使用。

yanglu_dandan的专栏 815

TADDConnetion组件,TADOQuery

一、TADDConnetion 二、TADOQuery   1、RecNo:从1开始     当前记录行数;ADOQuery1.RecNo     选择后一行数据集内容:ADOQuery1.RecNo:=ADOQuery1.RecNo+1;      选择前一行数据集内容:ADOQuery1.RecNo:=ADOQuery1.RecNo-1;    2、RecordCount:总个数 ...

weixin_30508241的博客 140

Berkeley DB的四种算法异同

DB数据的四种算法数据库应用中,数据访问方式对应数据在硬盘上的存储格式和操作方法。在编写应用时,选择合适的算法可以极大的提高运算速度。大多数数据库都选用Btree算法DB也不例外,同时还提供Hash算法Recno算法Queue算法Berkeley DB的强大之一是它为这几种算法提供了差不多相同的接口,这表明当你要使用另一种算法时修改程序是简单的。程序在需要对特殊数据结构和存取模式操作时,

chenmu_2002的专栏 3531

Berkeley DB的使用

最近在思考网络爬虫的增量更新问题,很明显,如果将URL放在unvisitedQueue中和visitedQueue中,而这两个队列仅仅简单的用JAVA提供的容器进行实现,那么由于内存的掉电易失性,再下一次爬爬取时,又是重复的从种子URL集合中取得URL,判断是否访问过,放入unvisitedQueue队列中,其实如果两次爬取的间隔时间不长的话,大量重复的链接被重复判断,效率极低。 如果爬虫想要实

卧龙居 2359

【搜索引擎】BerkeleyDB实现队列数据库

在使用爬虫爬取URL时,我们总会要使用到队列这一数据结构,在示例里,使用java写一个队列类可以解决此问题,但这种队列存储的数据只能存储在内存中,一旦断电,所有数据全部清空,下次又得重来。所以,这种队列不能用于解决问题,我们必须实现一个能够持久化数据的队列。下面是我用Berkeley DB实现的一个队列,BerkeleyDB是一个内存嵌入式数据库,当内存中存储的数据大于它缓冲区大小时,它就会把数据自

zgljl2012的专栏 2106
上一篇: Berkeley DB的四种算法异同
下一篇: 回复一些数据库的基本概念
chenmu_2002
博客等级 码龄25年 31粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值