小言_互联网的博客

一款非常优秀的内存数据库——lmdb

707人阅读  评论(0)

lmdb是一款开源的高效快速的内存映射数据库,C语言编写,基于B+树索引,支持MVCC事务处理,是一个嵌入到进程的数据库,不需要单独的数据库进程,在代码中使用lmdb的接口即可方便地实现读写lmdb数据库。

与几年前我曾经使用过的BerkelyDB有些小关系,这个数据库可支持多进程/线程的读写,

github:https://github.com/LMDB/lmdb.git

文档及注意事项,详见:http://www.lmdb.tech/doc/index.html

下载并编译、安装


  
  1. git clone https: //github.com/LMDB/lmdb.git
  2. cd lmdb/libraries/liblmdb
  3. make
  4. sudo make install

示例代码,main.cpp:


  
  1. #include <iostream>
  2. #include <string>
  3. #include <chrono>
  4. #include "lmdb.h"
  5. using namespace std;
  6. int main(int argc, char* argv[]){
  7. int res;
  8. MDB_env *env;
  9. MDB_dbi dbi;
  10. MDB_val key, data;
  11. MDB_txn *txn;
  12. MDB_cursor *cursor;
  13. //init lmdb
  14. cout<< "lmdb version:"<<mdb_version( 0, 0, 0)<< endl;
  15. res = mdb_env_create(&env);
  16. if(res){
  17. cout<< "mdb_env_create error,error:"<<mdb_strerror(res)<< endl;
  18. return -1;
  19. }
  20. res = mdb_env_open(env, "./lmdb_test", 0, 0644);
  21. if(res){
  22. cout<< "mdb_env_open error,detail:"<< mdb_strerror(res)<< endl;
  23. return -1;
  24. }
  25. res = mdb_txn_begin(env, NULL, 0, &txn);
  26. if(res){
  27. cout<< "mdb_txn_begin error,detail:"<< mdb_strerror(res)<< endl;
  28. return -1;
  29. }
  30. res = mdb_dbi_open(txn, NULL, 0, &dbi);
  31. if(res){
  32. cout<< "mdb_dbi_open error,detail:"<< mdb_strerror(res)<< endl;
  33. return -1;
  34. }
  35. do{
  36. //write data to lmdb
  37. for( int i= 0;i< 10;++i){
  38. MDB_val key, data;
  39. int value=i*i;
  40. key.mv_size = sizeof(i);
  41. key.mv_data =( void*)&i;
  42. data.mv_size = sizeof(value);
  43. data.mv_data = ( void*)&value;
  44. res = mdb_put(txn, dbi, &key, &data, 0);
  45. }
  46. res = mdb_txn_commit(txn);
  47. if (res) {
  48. cerr<< "mdb_txn_commit:"<< res<< ":"<< mdb_strerror(res)<< endl;
  49. break;
  50. }
  51. res = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
  52. res = mdb_cursor_open(txn, dbi, &cursor);
  53. //read data from lmdb
  54. while ((res = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
  55. int r_key=*( int *)key.mv_data;
  56. int r_value=*( int *)data.mv_data;
  57. cout<< "<"<<r_key<< ","<<r_value<< ">"<< endl;
  58. }
  59. mdb_cursor_close(cursor);
  60. mdb_txn_abort(txn);
  61. } while( 0);
  62. //free
  63. mdb_dbi_close(env, dbi);
  64. mdb_env_close(env);
  65. return 0;
  66. }

编译代码:

g++ -Wall -g main.cpp -o main -llmdb

在main程序所在目录,创建数据库目录testdb, 执行main程序(如果遇到找不到lmdb.so的错误, export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib):

./main

输出:

以上示例代码简单展示了lmdb库的用法,更详细的api使用请参考lmdb官方文档。


转载:https://blog.csdn.net/lianshaohua/article/details/108663203
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场