前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从Berkeley DB,认识没有服务进程的内嵌式数据库

从Berkeley DB,认识没有服务进程的内嵌式数据库

原创
作者头像
叫我阿柒啊
修改于 2024-08-27 10:05:31
修改于 2024-08-27 10:05:31
68506
代码可运行
举报
运行总次数:6
代码可运行

前言

说起数据库,很多人第一时间想到的是MySQL、oracle这样的关系型数据库,亦或者是redis这种KV结构的内存数据库。这些数据库在我们的生产环境中都是随处可见的。

后来我在学习python的爬虫框架Scrapy的时候,其中scrapy-deltafetch插件,解决了每次启动无法从上次结束位置接着爬取的问题。在深入学习的过程中了解到,scrapy-deltafetch这一功能是由嵌入式数据库Berkeley DB实现的。

嵌入式数据库

平时我们使用的 MySQL、redis 等,都需要在服务器上首先部署独立的软件服务,然后每个服务监听一个端口(例如MySQL的3306、redis的6376)。然后我们在编程开发中,通过客户端或者SDK连接这些服务。

这也意味着如果想获取MySQL、redis中的数据,用户程序要和就要和它们进行通讯,且出现网络波动、网络中断都会影响正常的数据库连接和请求。

那什么是嵌入式数据库呢?顾名思义,嵌入式数据就是将数据库嵌入到了应用程序进程中,同应用程序在相同的地址空间中运行,所以程序和嵌入式数据库不需要进程间(程序与服务)的通讯。

其次,嵌入数据库是一种具备了基本数据库特性的数据文件,提供了一套API去访问、管理一个数据库文件,采用程序方式直接驱动,而非引擎响应方式驱动。

常见的内嵌式数据库

在我的大数据开发生涯中,我遇到过三种内嵌式数据库:

  1. SQLite:SQLite是一个关系型的SQL数据库引擎。
  2. Berkeley DB:Berkeley DB是一个高性能的嵌入式数据库,支持键值存储模式。我在scrapy-deltafetch插件中第一次了解。
  3. RocksDB:从LevelDB派生出来的一个键值数据库引擎,我在学习flink开发的时候,RocksDB用作存储状态后端。

Berkeley DB安装

为了进一步更好地理解在嵌入式数据库章节中提到的理论,这里就用BerkeleyDB来做一个对于内嵌式数据库的操作。

我在这里选择python,python提供了berkeleydb和bsddb3两个库来操作BerkeleyDB。操作系统使用的Linux和macos(这两个系统的操作都一样),之所以没有选择windows,是因为windows安装bsddb3模块,确实比较麻烦,后面会讲。

1. Berkeley DB安装

在oracle的官网下载BerkeleyDB的安装包,然后解压,编译、安装。

代码语言:shell
AI代码解释
复制
cd build_unix
../dist/configure --prefix=/usr/local/BerkeleyDB
make & make install 

2. 模块安装

这样,在我们的Linux系统上就安装成功了BerkeleyDB。然后就安装berkeleydb和bsddb3模块。

代码语言:shell
AI代码解释
复制
export BERKELEYDB_DIR=/usr/local/BerkeleyDB
export YES_I_HAVE_THE_RIGHT_TO_USE_THIS_BERKELEY_DB_VERSION=yes   
pip3 install bsddb3
pip3 install berkeleydb

如果我们不设置变量BERKELEYDB_DIR的话,在使用pip安装模块时,就会提示让你指定BerkeleyDB的安装目录,这样才能将“将数据库嵌入到了应用程序进程中”。

BerkeleyDB 从版本 6.x 开始使用了GPL(GNU Affero General Public License) 许可证。这意味着,如果你使用该版本的BerkeleyDB,并将其集成到你的软件中,那么根据 AGPL 许可证的规定,你的整个软件也必须开源,除非你有一个与Oracle公司签订的商业许可协议。

为了确保开发者在使用 Berkeley DB 版本 6.x 或更高版本时理解并接受这些许可证条款,Berkeley DB的源代码中包含了一段代码,要求开发者明确设置 YES_I_HAVE_THE_RIGHT_TO_USE_THIS_BERKELEY_DB_VERSION 这个宏。在编译代码时,你需要显式定义这个宏来确认你有权使用当前版本的 Berkeley DB。

如果不指定的话,在安装的时候就会失败,并给出响应的提示。

最后,成功安装berkeleydb模块。

数据库操作

要想使用MySQL,我们首先要create database,然后create table,这样我们就可以通过MySQL的客户端和SDK,对表数据做增删改查。

MySQL

MySQL有自己的数据库管理系统,在创建数据库会默认在/var/lib/mysql下创建一个同名目录,然后表数据都会存放在这个目录下。

如图,我在tencent数据库下有一个cartoon表,在MySQL的文件系统中的tencent目录下,就有对应的cartoon.idb,其中 .ibd 文件包含表的数据和索引。

redis

而对于redis来说,数据是放在内存中的,当机器宕机或者redis服务故障重启的时候,内存中的数据就会丢失。为了解决这个问题,redis使用RDB(Redis DataBase)和AOF(Append Only File)来持久化数据,当重启时可以从持久化文件中加载数据。

从上面的信息可以看出,MySQL和redis都有自己的文件系统,且数据文件都存放在服务所在的服务器上。

Berkeley DB

在Berkeley DB内嵌数据库中,它也有自己的文件系统,但是因为内嵌式数据库是与程序一起运行的,所以数据文件是放在程序目录(客户端)中的。

而且因为内嵌式数据库没有自己的服务,我们就无法通过类似MySQL、redis这种终端命令去创建数据库,以及对数据的增删改查。只能在程序中通过API来操作数据库。例如,我使用berkeleydb模块来来创建一个数据库。

代码语言:python
代码运行次数:4
运行
AI代码解释
复制
import berkeleydb

db = berkeleydb.hashopen('aqi.db', 'c')
db[b'aqi'] = b'qi'
print(db[b'aqi'])

其中,'c' 表示创建数据库,如果不存在的话;如果已存在,则打开数据库。因为Berkeley DB是一个KV数据库,所以将字符串'aqi'作为key存放到数据库中。运行程序:

如图所示,从右侧可能看到创建了一个aqi.db的数据文件,在控制台也打印出来从Berkeley DB中获取的数据。这时候如果我们删除存放数据的代码,直接获取数据库中的数据,运行程序:

从控制台可以看出,也获取到了之前存放的数据。所以,在程序内部就实现了类似于MySQL的文件系统。

通过上面代码,你会发现在python中对于Berkeley DB的操作,和python对于map的操作是一模一样的。但区别就是一旦程序重启,map中的数据(在内存中)就会丢失,而Berkeley DB中的数据就能持久化下来生成db文件。

而且多个线程、多个程序乃至多个开发者之间都可以共享数据库文件。我用bsddb3模块来读取berkeleydb生成的aqi.db数据文件,代码如下:

代码语言:python
代码运行次数:2
运行
AI代码解释
复制
from bsddb3 import db

bsddb = db.DB()
bsddb.open("aqi.db")
value = bsddb.get(b'aqi')
print(value)

运行程序,从控制台可以看到成功从aqi.db中读到了数据。

结语

本篇文章主要从Berkeley DB角度,讲述了内嵌数据库的理论和使用,内嵌数据库没有自己的服务进程,所以对于它的操作看起来更像是一个“规则化的本地化文件读写”。

在python中,为Berkeley DB提供了简单易操作的接口,我们可以从很多场景去使用Berkeley DB,例如记录去重等,跟多的使用技巧值得去探索。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Scrapy08:Deltafetch,让爬虫有了记忆
很多时候,爬虫程序跑着跑着,因为网络故障或者程序异常就宕掉了。无奈之下只能重启重新爬取。为了避免这种每次重头再来的情况,我们都会利用mysql、redis、文本等方式,来记录一下爬取过的url。
叫我阿柒啊
2022/12/18
6280
Scrapy08:Deltafetch,让爬虫有了记忆
移动端常用数据库
常用数据库,通常面试都会说用SQLite 嵌入式数据库是轻量级的,独立的库,没有服务器组件,无需管理,一个小的代码尺寸,以及有限的资源需求。目前有几种嵌入式数据库,你可以在移动应用程序中使用。让我们来看看这些最流行的数据库。 Berkeley DB Berkeley DB是由美国Sleepycat Software公司开发的一套开放源代码的嵌入式数据库管理系统(已被Oracle收购),它为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。 Berkeley DB(BDB)是一个高效的嵌入式
程序员不务正业
2018/06/14
2.2K0
15个nosql数据库
1、MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案。当数据量达到50GB以上的时候,MongoDB的数据库访问速度是MySQL的10倍以上。MongoDB的并发读写效率不是特别出色,根据官方提供的性能测试表明,大约每秒可以处理0.5万~1.5万次读写请求。MongoDB还自带了一个出色的分布式文件系统GridFS,可以支持海量的数据存储。 MongoDB也有一个Ruby的项目Mongo
cloudskyme
2018/03/20
2.5K0
15个nosql数据库
matinal:高质量内存数据库技术选型推荐(一)
一、什么是内存数据库 传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称做磁盘数据库(DRDB:Disk-Resident Database)。磁盘数据库需要频繁地访问磁盘来进行数据的操作,由于对磁盘读写数据的操作一方面要进行磁头的机械移动,另一方面受到系统调用(通常通过CPU中断完成,受到CPU时钟周期的制约)时间的影响,当数据量很大,操作频繁且复杂时,就会暴露出很多问题。     近年来,内存容量不断提高,价格不断下跌,操作系统已经可以支持更大的地址空间(计算机进入了64位时代),同时对数据库系统实时响应能力要求日益提高,充分利用内存技术提升数据库性能成为一个热点。     在数据库技术中,目前主要有两种方法来使用大量的内存。一种是在传统的数据库中,增大缓冲池,将一个事务所涉及的数据都放在缓冲池中,组织成相应的数据结构来进行查询和更新处理,也就是常说的共享内存技术,这种方法优化的主要目标是最小化磁盘访问。另一种就是内存数据库(MMDB:Main Memory Database,也叫主存数据库)技术,就是干脆重新设计一种数据库管理系统,对查询处理、并发控制与恢复的算法和数据结构进行重新设计,以更有效地使用CPU周期和内存,这种技术近乎把整个数据库放进内存中,因而会产生一些根本性的变化。
matinal
2023/11/22
1.5K0
嵌入式数据库调研
最近需要使用嵌入式数据库进行存储应用本地信息,本文章主要进行记录当前比较流行的嵌入式数据库相关的链接,嵌入式数据库往往是以lib的形式存在,常用于持久化存储软件的信息,嵌入式数据库往往和应用软件紧密集成:
西湖醋鱼
2020/12/30
1.6K0
MySQL数据库存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建,查询,更新和删除数据 不同的存储引擎提供不同的存储机制,索引技巧,锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能,现在许多不同的数据库管理系统都支持多种不同的数据引擎
编程思维
2023/03/24
5.8K1
MySQL数据库存储引擎
vcenter内嵌和外链数据库的解析
还有就是VCNEGER是部署在windows系统上的,后面一般是SQL SERVER 数据库。sql2008 R2可以用于小型部署(最多5个主机和 50 个虚拟机)的捆绑数据库。
孙杰
2019/10/29
1.9K0
vcenter内嵌和外链数据库的解析
0695-5.10.2-如何将CM的外部PostgreSQL数据库迁移至MySQL服务
在前面的文章《如何将CM内嵌PostgreSQL服务迁移至外部PostgreSQL服务》介绍了将CM内嵌的PostgreSQL迁移至外部PostgreSQL,因为CM内嵌的PostgreSQL数据库不支持直接迁移至MySQL。本篇文章Fayson主要介绍如何将集群使用的外部PostgreSQL迁移至MySQL数据库。
Fayson
2019/09/03
1.6K0
0695-5.10.2-如何将CM的外部PostgreSQL数据库迁移至MySQL服务
H2 数据库
H2 是标准 SQL 的关系型数据库,由 java 编写,整个 H2 是一个 jar 包(大约 2.5MB),其开源且使用 JDBC API 进行调用。其主要特性如下:
晚上没宵夜
2022/09/07
1.2K0
0709-5.16.2-如何将CM的外部PostgreSQL数据库迁移至MySQL服务
在前面的文章《5.16.2-如何将CM内嵌PostgreSQL服务迁移至外部PostgreSQL服务》介绍了将CM内嵌的PostgreSQL迁移至外部PostgreSQL,因为CM内嵌的PostgreSQL数据库不支持直接迁移至MySQL。本篇文章Fayson主要介绍如何将集群使用的外部PostgreSQL迁移至MySQL数据库。
Fayson
2019/10/09
2K0
0709-5.16.2-如何将CM的外部PostgreSQL数据库迁移至MySQL服务
h2数据库使用_数据库教程
H2是一个采用java语言编写的嵌入式数据库引擎,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制
全栈程序员站长
2022/11/07
3.5K0
h2数据库使用_数据库教程
MySQL数据库基础
客户端就是我们正常使用的mysql,我们通过客户端向服务端发送需求,服务端通过某些算法访问"数据库文件"来解决需求拿到结果,最后将结果发送给客户端让客户拿到,逻辑图如下:
咬咬
2024/07/20
1000
MySQL数据库基础
最全Python数据工具箱:标准库、第三方库和外部工具都在这里了
导读:Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库、函数和外部工具。其中既有Python内置函数和标准库,又有第三方库和工具。这些库可用于文件读写、网络抓取和解析、数据连接、数清洗转换、数据计算和统计分析、图像和视频处理、音频处理、数据挖掘/机器学习/深度学习、数据可视化、交互学习和集成开发以及其他Python协同数据工作工具。
IT阅读排行榜
2018/08/16
6.5K0
揭秘:微信背后的神秘数据库,每天十数亿人涉足,你绝对不能错过!
SQLite,一个嵌入式的数据库系统,无需服务器、无需专门的配置,却能为移动应用提供卓越的性能。
程序视点
2024/03/11
1.3K0
揭秘:微信背后的神秘数据库,每天十数亿人涉足,你绝对不能错过!
H2数据库入门_H2数据库越来越大
  1、H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。   H2最大的用途在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。   它的另一个用途是用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。   H2的第三个用处是作为缓存,作为NoSQL的一个补充。当某些场景下数据模型必须为关系型,可以拿它当Memcached使,作为后端MySQL/Oracle的一个缓冲层,缓存一些不经常变化但需要频繁访问的数据,比如字典表、权限表。不过这样系统架构就会比较复杂了。   2、H2的产品优势:   纯Java编写,不受平台的限制;   只有一个jar文件,适合作为嵌入式数据库使用;   h2提供了一个十分方便的web控制台用于操作和管理数据库内容;   功能完整,支持标准SQL和JDBC。麻雀虽小五脏俱全;   支持内嵌模式、服务器模式和集群。
全栈程序员站长
2022/11/04
1.1K0
Scrapy入门到放弃07:爬虫的远程启停、监控
上一篇的枯燥无味,这一篇来还。写到插件篇了,终于能写点有意思的东西了,接下来就基本用法和插件篇来穿插着写一写。
叫我阿柒啊
2022/05/09
1.1K0
Scrapy入门到放弃07:爬虫的远程启停、监控
MySQL数据库——数据库的基本概念及MySQL的安装步骤与基本使用
数据库,DataBase,简称为DB,数据库就是用于存储和管理数据的仓库,其特点是:
Winter_world
2020/09/25
1.1K0
MySQL数据库——数据库的基本概念及MySQL的安装步骤与基本使用
【MySQL基础篇】一、数据库基础知识
​ 什么意思呢,比如说我们如果用普通文件作为数据库的话,那么就会有访问控制、数据加密、完整性保护、备份和恢复、病毒和恶意软件等安全性问题的存在;或者说此时有一大批数据,比如说有几万条 IP 地址,那么如果我们想筛选出以 192 开头的 IP 地址,对于普通文件来说我们就得用编程语言去读取文件,然后再依次判断每个 IP 地址是否符合要求,这显然是有点挫!
利刃大大
2025/01/26
2120
【MySQL基础篇】一、数据库基础知识
数据库
简单的说,数据库(因为Database)就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方式来管理数据库里的数据。 更简单形象的理解,数据库和我们生活中存放杂物的储物间仓库性质一样,区别只是存放的东西不同,杂物间存放实体的物件,而数据库里存放的是数据。
爱喝水的木子
2022/01/12
2.2K0
Java开发环境系列:H2内嵌式数据库使用教程
H2数据库是一个开源的,使用java开发的内嵌式数据库。使用者不需要像Oracle、MySQL等数据库一样动则安装几百兆甚至几G的安装程序。以下使用步骤以统一门户系统为例。
架构师小跟班
2019/08/07
2K0
Java开发环境系列:H2内嵌式数据库使用教程
推荐阅读
相关推荐
Scrapy08:Deltafetch,让爬虫有了记忆
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验