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余年的历史,字面上却是城的意思。

相关推荐
likangbinlxa19 分钟前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦1 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·2 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i3 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.3 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn3 小时前
【Redis】渐进式遍历
数据库·redis·缓存