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

相关推荐
金色天际线-32 分钟前
mysql全量+增量备份脚本及计划任务配置
数据库·mysql
zym大哥大35 分钟前
MySQL用户管理
数据库·mysql
对着晚风做鬼脸35 分钟前
MySQL 运维知识点(十六)---- 读写分离
运维·数据库·mysql·adb
老朋友此林36 分钟前
高并发下如何保证 Caffeine + Redis 多级缓存的一致性问题?MySQL、Redis 缓存一致性问题?
数据库·redis·缓存
会飞的鱼_12341 分钟前
MySQL主主复制+Keepalived高可用集群搭建与故障切换实战
数据库·mysql
gsfl4 小时前
Redis分布式锁
数据库·redis·分布式
Li zlun4 小时前
MySQL 配置管理与日志系统完全指南:从基础到高级优化
数据库·mysql
wzg20165 小时前
vscode 配置使用pyqt5
开发语言·数据库·qt
老朋友此林6 小时前
MongoDB GEO 项目场景 ms-scope 实战
java·数据库·spring boot·mongodb
板鸭〈小号〉7 小时前
Socket网络编程(1)——Echo Server
开发语言·网络·php