一款非常优秀的内存数据库——lmdb-程序员宅基地

技术标签: c++  内存数据库  linux  lmdb  

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

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

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

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

下载并编译、安装

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

示例代码,main.cpp:

#include <iostream>
#include <string>
#include <chrono>

#include "lmdb.h"


using namespace std;

int main(int argc, char* argv[]){

    int res;
    MDB_env *env;
    MDB_dbi dbi;
    MDB_val key, data;
    MDB_txn *txn;
    MDB_cursor *cursor;

    //init lmdb
    cout<<"lmdb version:"<<mdb_version(0, 0, 0)<<endl;
    res = mdb_env_create(&env);
    if(res){
        cout<<"mdb_env_create error,error:"<<mdb_strerror(res)<<endl;
        return -1;
    }

    res = mdb_env_open(env, "./lmdb_test", 0, 0644);
    if(res){
        cout<<"mdb_env_open error,detail:"<< mdb_strerror(res)<<endl;
        return -1;
    }

    res = mdb_txn_begin(env, NULL, 0, &txn);
    if(res){
        cout<<"mdb_txn_begin error,detail:"<< mdb_strerror(res)<<endl;
        return -1;
    }

    res = mdb_dbi_open(txn, NULL, 0, &dbi);
    if(res){
        cout<<"mdb_dbi_open error,detail:"<< mdb_strerror(res)<<endl;
        return -1;
    }

    do{
        //write data to lmdb
        for(int i=0;i<10;++i){
            MDB_val key, data;
            int value=i*i;
            key.mv_size =sizeof(i);
            key.mv_data =(void*)&i;

            data.mv_size = sizeof(value);
            data.mv_data = (void*)&value;

            res = mdb_put(txn, dbi, &key, &data, 0);
        }

        res = mdb_txn_commit(txn);
        if (res) {
            cerr<<"mdb_txn_commit:"<< res<<":"<< mdb_strerror(res)<<endl;
            break;
        }

        res = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
        res = mdb_cursor_open(txn, dbi, &cursor);

        //read data from lmdb
        while ((res = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
            int r_key=*(int *)key.mv_data;
            int r_value=*(int *)data.mv_data;
            cout<<"<"<<r_key<<","<<r_value<<">"<<endl;
        }

        mdb_cursor_close(cursor);
        mdb_txn_abort(txn);
    }while(0);

    //free
    mdb_dbi_close(env, dbi);
    mdb_env_close(env);
    return 0;
}

编译代码:

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官方文档。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lianshaohua/article/details/108663203

智能推荐

Linux 磁盘管理及磁盘分区(主分区、扩展分区、逻辑分区)_linux分区-程序员宅基地

文章浏览阅读9.7k次,点赞26次,收藏104次。Linux 磁盘管理及磁盘分区(主分区、扩展分区、逻辑分区)MBR xfsswapFAT16 FAT32EXT4JFS_linux分区

java关键字abstract(抽象)详解_abstractjava-程序员宅基地

文章浏览阅读10w+次,点赞227次,收藏778次。说到抽象,想必大家第一个联想到的就是抽象画,基本上看不懂画的是啥,只能说它在表达某个概念。 在java中我们中abstract关键字来表达抽象。举个例子: 我们说车子都可以跑(run)。但有几个轮子,怎么跑,对于不同的车有不同的结果。自行车需要人踩着跑,汽车发动机推动跑等等,那么我们可以车表达为抽象类。/** * 车子类 */public abstract class Car {_abstractjava

使用el-table选择进行保存,实现分页多选,设置选中,编辑原数据默认值不变_el-table 多选框默认选中 样式不更新-程序员宅基地

文章浏览阅读1.7k次。el-table分页选择,默认选中设置,二次选择原商品编辑的数据不变_el-table 多选框默认选中 样式不更新

信息安全产品认证_网络关键设备和网络安全专用产品安全认证证书-程序员宅基地

文章浏览阅读5.6k次。目前市场上通行的信息安全产品认证有三种,分别是:1.《网络关键设备和网络安全专用产品安全认证证书》2.《中国国家信息安全产品认证证书》3.《IT产品信息安全认证证书》其中《中国国家信息安全产品认证证书》、《网络关键设备和网络安全专用产品安全认证证书》为强制性认证证书,在产品功能和性能满足条件的情况下,两张证书可以同一产品同时认证同时发证。《IT产品信息安全认证证书》为自愿性认证证书。_网络关键设备和网络安全专用产品安全认证证书

从零构建一个微信小程序_从零搭建一个微信小程序-程序员宅基地

文章浏览阅读1.3k次。一、微信小程序介绍微信小程序,简称小程序,英文名:Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用。1.1 为什么是微信小程序?微信有海量用户,而且粘性很高,在微信里开发产品更容易触达用户。推广 app 或公众号的成本太高。开发适配成本低。容易小规模试错,然后快速迭代。跨平台。1.2 还有其他的小程序 不容忽视支付宝小程序百度小程序QQ 小程序今日头条 + 抖音小程序1.3 优秀的第三方小程序_从零搭建一个微信小程序

前端开发:CSS的“*”“#”“.”符号的对比使用_css中".","#","*"的区别和作用-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏7次。在前端开发过程中,CSS是前端的三驾马车之一,关于CSS的使用也是非常重要的环节,可能有人觉得在前端学习或开发中最容易的就是关于CSS的,但是要想精通使用CSS也不是一件容易的事情,也就是看着简单要想完美使用难,所以CSS的使用也是不容忽视的。本篇博文来分享一个关于CSS的符号相关内容,关于它的使用也是比较常用的,常用的有:“*”、“#”、“.”等符号,所以在前端项目开发中经常会用到该功能,总结一下,方便查阅使用。.................._css中".","#","*"的区别和作用

随便推点

模拟人生4 Mac(经营模拟游戏)全DLC可无限金币版_mac.orsoon-程序员宅基地

文章浏览阅读2k次。模拟人生4 Mac是EA旗下模拟人生系列的作品,模拟人生4 mac版集成游戏发售至今全部DLCs,含圣诞包,游戏原声。模拟人生4 Mac游戏中可供玩家使用的大城市、小城市、乡村、岛屿,地图就超过40个,如果对提供的地图不满意还可以自创地图。包含除此之外sims4中文版还可以无限金币操作,让您不用担心钱不够花!模拟人生4 mac中文版兼容最新macOS11.X Big Sur系统,模拟人生4Mac版新增了情感要素,情绪成为关键元素,极大的提升了人物角色的个性。除此之外模拟人生4 Mac版游戏在还有诸多的全新特_mac.orsoon

使用postman时报Error: Parse Error: Header overflow解决方法_parse error: there seems to be an invalid characte-程序员宅基地

文章浏览阅读1.7w次,点赞8次,收藏7次。产生原因:标头溢出,因响应的标头X-Subject-Token 超出postman默认的8k大小,这是Postman v7.2.5.1中引入的回归问题。解决措施:添加一个变量即可,可以是临时的,也可以是永久的1,临时变量:打开postman属性,找到目标文件位置,使用cmd切换到该路径设置环境变量set NODE_OPTIONS=--max-http-header-size=16384 为16k,然后使用Postman.exe回车,打开2,鼠标右键点击“此电脑”..._parse error: there seems to be an invalid character in the response header v

零/低代码编程风口已到,请快快上车!-程序员宅基地

文章浏览阅读300次。前言随着我国互联网+的迅猛发展,目前众多企业开始转型或者拥抱互联网,企业也在不断增加对企业信息化的需求,为了跟上互联网发展的潮流,许多企业加快了信息化建设的步伐。如今,一些有着先进管理思想的企业已经开始对企业进行信息化和数字化转型,希望能通过信息化和数字化转型在企业中的实施,来提高企业的工作效率,降低成本,加速流动资金流转,加大管理力度,尽可能的提高企业在市场上的综合竞争力。要实现企业的数字化转型,软件系统必不可少,但是面对市场上形形色色的软件公司及软件产品,如何选择适合企业自身发展的应用系统便成了一大_编程风口

SIFT_GLCM_LBP_HOG_glcm hog-程序员宅基地

文章浏览阅读1.1k次。SIFTScale invariant feature Transform,尺度不变特征变换。目的是解决低层次特征提取及其图像匹配。在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量。特点:1. SIFT特征是局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;2. 独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的..._glcm hog

分析计算机体系结构的性能指标-程序员宅基地

文章浏览阅读610次,点赞6次,收藏10次。1.背景介绍计算机体系结构(Computer Architecture)是计算机科学的一个重要分支,它研究计算机系统的组成、功能和性能。计算机体系结构的性能指标是衡量计算机系统性能的重要标准,它们可以帮助我们了解计算机系统的性能特点,并为系统优化和设计提供指导。在本文中,我们将从以下几个方面进行探讨:背景介绍核心概念与联系核心算法原理和具体操作步骤以及数学模型公式详细讲解具体代...

ADB 命令结合 monkey 的简单使用,超详细-程序员宅基地

文章浏览阅读960次,点赞23次,收藏16次。adb shell monkey -p -v -v -v --throttle 1000 200 >D:\log.txt:指定应用随机操作200次,每1000毫秒点击一次,并打印日志到指定路径/文件。adb shell:登录设备 shell,该命令将登录设备的shell(内核),登录shell后,可以使用 cd,ls,rm 等Linux命令。注意:安装时安装的是apk,卸载时是包名,可以通过 adb shell pm list packages 查看需要卸载的包名。

推荐文章

热门文章

相关标签