NoSQL的鼻祖——DBM

NoSQL的鼻祖------DBM

DBM是来自Unix的键值数据库(key-value database)(数据库系统),能够通过主键快速访问数据,可谓现在NoSQL的鼻祖。DBM(D ataB ase Manager的缩写)最初由计算机界的大佬Ken Thompson编写,于1979年发布。DBM现在也泛指一系列由此派生而来的数据库(如ndbm、gdbm、lmdb等),有时也指用于操作这些数据库的代码库(library)或例程(routine)。

不过DBM只是一个简单的数据库引擎,仅以代码库(library)的形式向用户提供一系列API,并不支持SQL语句。我们可以将DBM的数据库看作是存储在硬盘上的哈希表。

数据库引擎(database engine)

也称存储引擎,是支持数据库管理系统 (DBMS)对数据库(文件)进行CRUD的底层组件。大多数数据库管理系统都包含自己的API,允许用户通过API直接与其底层的存储引擎交互。

下面我们使用"世界上最好的语言"PHP来体验一下DBM。之所以使用PHP,是因为PHP内置了一个叫做DBA(www.php.net/manual/en/b...)的扩展,只是估计很少有人用过这个扩展吧。

bash 复制代码
$ php -r "var_dump(dba_handlers());" 
array(5) {
  [0]=>
  string(4) "ndbm"
  [1]=>
  string(3) "cdb"
  [2]=>
  string(8) "cdb_make"
  [3]=>
  string(7) "inifile"
  [4]=>
  string(8) "flatfile"
}

首先通过dba_handlers()函数来看一看系统支持的DBM,这里的ndbm和cdb都派生自DBM。接下来我们再通过一小段代码,看看如何对DBM(ndbm)进行增删改查。

php 复制代码
<?php
$id = dba_open("/tmp/test.db", "n", "ndbm"); // mode `n` for create, truncate and read/write access
if (!$id) {
    echo "dba_open failed\n";
    exit;
}

dba_replace("key", "This is an example!", $id);
if (dba_exists("key", $id)) {
    echo dba_fetch("key", $id), PHP_EOL;
    dba_delete("key", $id);
}
var_dump(dba_fetch("key", $id));

dba_close($id);

dba_open()的第3个参数是"DBM系"数据库的名字(在PHP DBA扩展中叫做handler)。从设计模式的角度看,DBA相当于接口,handler相当于实现类。从MySQL架构的角度看,DBA相当于MySQL Server,handler相当于Pluggable Storage Engine。

在本例中,我们使用ndbm这个handler。执行结果如下所示。

bash 复制代码
/tmp $ php dbm.php
This is an example!
bool(false)

我们还可以通过strings命令查看存储在DBM数据库中的数据。

php 复制代码
// $id resource returned from `dba_open`
dba_replace("key", "This is an example!", $id);
dba_replace("foo", "bar", $id);
dba_sync($id);
bash 复制代码
$ strings test.db.db
barfoo
This is an example!key

关于ndbm这个名字还有个冷笑话,

Although NDBM is now old - like the city named New Town ('Neapolis') by the Greeks in about 600BC and still called Naples today - it remains the baseline DBM.

------ Kew, Nick (2007). The Apache Modules Book: Application Development with Apache. Prentice Hall Professional. ISBN 9780132704502. p.80

NDBM虽然叫New DBM,但也颇有历史了。就好像那不勒斯这座城市,虽然已有2700余年的历史,字面上却是城的意思。

相关推荐
InfinteJustice2 分钟前
mysql如何排查插件加载失败原因_mysql plugin目录与权限核对
jvm·数据库·python
qq_189807034 分钟前
Go语言怎么连接Elasticsearch_Go语言Elasticsearch教程【收藏】
jvm·数据库·python
迷藏49413 分钟前
**TiDB 在高并发场景下的性能优化实战:从慢查询到极致吞吐的跃迁**在现代分布式系统中,数据库不仅是数据存储的
java·数据库·python·性能优化·tidb
m0_6784854513 分钟前
如何自动同步SQL异构表数据_利用触发器实现实时数据复制
jvm·数据库·python
介一安全18 分钟前
【Web安全】PHP内置Web服务器SSRF漏洞:从原理到实战利用全解析
web安全·网络安全·php·安全性测试
Shorasul22 分钟前
如何防御SQL注入的SQL畸形查询_利用语法分析器检测
jvm·数据库·python
黑牛儿30 分钟前
2026 慢 SQL 优化手册:EXPLAIN 深度解读 + 9 类索引失效场景(生产避坑)
数据库·sql
jgszhuzhu38 分钟前
mysql 独立用户
数据库·mysql
oradh41 分钟前
Oracle数据库完整性约束概述
数据库·oracle·数据库基础·数据库入门·oracle数据完整性·oracle数据库约束类型
AKA__Zas42 分钟前
视图与索引
数据库·学习方法