解释如下:
LMDB是在BerkeleyDB的基础上基于B树与来管理数据的数据库。其所有的数据均通过mmap从内存中读出,所以不需要maclloc以及memcpy操作参与。由于不需要page缓存层的参与,所以该数据库非常简单与高效。同样该DB使用ACID语义,当内存映射为只读时,数据库完整性不会被应用程序代码中的指针写入破坏。
该DB支持多线程多进程并发读写操作。数据页使用“写时复制”策略,所以避免了数据的重写
,所以支持很好的错误恢复特性。其写操作是顺序进行的,在一个时间只允许一个写操作进行因此保证了写者不会死锁。数据结构是多版本的所以读者可以在无锁的环境下进行操作;除此之外,写者不会阻塞写操作,反之也是。
不同于其他使用写前日志或追加写
方案的的数据库,LMDB在操作时没有进行维护工作
。上述两种方案均需要定期进行检查点保存或者log合并。而LMDB会追踪空闲的页并重复利用他们进行后续写,所以数据库的大小并不会增长的太严重。
mmap机制被用于只读或者读写映射,默认情况下呗设置为只读从而防止数据库被破坏。使用读写模式可以提高写性能,但是一些应用如果编写不严格会破坏数据库
。
次使用kv存储,我们需要看一下下面的内容:
为了解决文件锁问题,需要对BSD系统增加信号量机制:
- 损坏的锁文件会造成同步问题
被中止的程序留下的陈旧的读取器事务会导致进一步的写入操作,从而使数据库快速增长,并且陈旧的锁可能会阻止进一步的操作。
一个时间一个线程只能操作一个任务。
一个进程不能同时打开两次LMDB数据库。
避免长周期的任务操作,读操作会阻碍写操作复用page,从而使得数据库增长速度变快。由于写是顺序进行,所以写操作同样会阻碍其他写操作。
避免将正在运行的工作挂起。作者提交时暂停的读取事务有时可能会看到错误的数据。
当多进程同时使用数据库的时候需要注意:
- 避免强行中止正在工作的进程
需要定期检查过少id读操作,或者关闭工作环境从而使得锁文件可以重置。
不用在远程文件系统上使用LMDB,因为这会使得flock()在某些操作系统上失效。
同时打开或者关闭数据库会使得操作失效。