LMDB: Lightweight Memory Mapped Database ----- Primeiros passos 1

Prefácio

         Com base na introdução do LMDB no artigo anterior , este artigo apresenta o uso básico do banco de dados LMDB, incluindo criação de ambiente, armazenamento de dados colocado, leitura de dados, obtenção, etc .;

Código fonte

ULONG cvtest_Test4_Lmdb()
{   
    INT iRet;
    MDB_txn *pstTxn = NULL;
    MDB_dbi stDbi;
    UINT uiKey = 1;
    UINT uiData = 100;
    
    iRet = mdb_env_create(&g_pstMdbEnv);
    if (0 != iRet)
    {
        return ERROR_FAILED;
    }
    mdb_env_set_maxreaders(g_pstMdbEnv, 1);
    mdb_env_set_mapsize(g_pstMdbEnv, 4096 * 4096);
    
    if (ERROR_SUCCESS != Lib_CreateDir(CVTEST_LMDB_PATH))
    {
        mdb_env_close(g_pstMdbEnv);
        return ERROR_FAILED;
    }
    iRet = mdb_env_open(g_pstMdbEnv, CVTEST_LMDB_PATH, MDB_WRITEMAP, 0);
    E(iRet, "Env open failed...");
    
    iRet += mdb_txn_begin(g_pstMdbEnv, NULL, 0, &pstTxn);
    E(iRet, "Txm begin open failed...");
    
    iRet += mdb_dbi_open(pstTxn, NULL, MDB_CREATE, &stDbi);
    E(iRet, "dbi_open failed...");
    
    MDB_val stKey;
    MDB_val stData;
    stKey.mv_size = sizeof(UINT);
    stKey.mv_data = (VOID *)&uiKey;

    /* mdb_put  存数据 */
    stData.mv_size = sizeof(UINT);
    stData.mv_data = (VOID *)&uiData;
    iRet = mdb_put(pstTxn, stDbi, &stKey, &stData, 0);
    if (iRet != MDB_SUCCESS)
    {
        printf("mdb_put failed : %s\n", mdb_strerror(iRet));
        mdb_env_close(g_pstMdbEnv);
        return ERROR_FAILED;
    }
    mdb_txn_commit(pstTxn);

    /* 重新begin一个事务---进行读 */
    MDB_txn *pstReadTxn = NULL;
    MDB_dbi stDbiRead;
    MDB_val stReadValue;    
    CHAR szBuf[BUF_LEN_100] = {0, };
    
    stReadValue.mv_size = BUF_LEN_100;
    stReadValue.mv_data = (VOID *)szBuf;
    mdb_txn_begin(g_pstMdbEnv, NULL, MDB_RDONLY, &pstReadTxn);
    iRet = mdb_dbi_open(pstReadTxn, NULL, 0, &stDbiRead);

    iRet += mdb_get(pstReadTxn, stDbiRead, &stKey, &stReadValue);
    if (iRet != MDB_SUCCESS)
    {
        printf("mdb_get failed : %s\n", mdb_strerror(iRet));
        return ERROR_FAILED;
    }
    printf("stReadValue.data is %d \n", *(UINT *)stReadValue.mv_data);
    return ERROR_SUCCESS;
}

Interpretação do código fonte

  1. De acordo com o documento oficial de introdução do LMDB, primeiro crie env por meio de mdb_env_create e, em seguida, mdb_env_set_maxreaders e mdb_env_set_mapsize para definir parâmetros relacionados ao ambiente;
  2. Lib_CreateDir é usado para criar o diretório do banco de dados , o documento oficial menciona: mdb_env_open parameter 2 não cria um diretório relacionado para o usuário, então ele precisa ser criado com antecedência;
  3. mdb_env_open, mdb_txn_begin e mdb_dbi_open são usados ​​para abrir o ambiente, abrir uma transação e abrir uma instância de banco de dados, respectivamente . Entre eles, mdb_dbi_open oferece suporte a várias instâncias por meio de diferentes nomes de banco de dados (parâmetro 2) ;
  4. mdb_put é usado para armazenar dados relevantes: pares chave / valor, ambos os quais são estrutura MDB_val;
  5. Os usuários mdb_get subsequentes obtêm dados. A chave é a mesma que a chave quando colocada. Depois que a obtenção for bem-sucedida, obtemos o valor no banco de dados por meio da conversão forçada de tipo e o imprimimos;
  6. E é uma definição de macro encapsulada pelo autor para verificar o resultado de retorno da API, da seguinte forma:
#define E(Rest, expr) LMDB_CHECK((Rest) == MDB_SUCCESS, #expr)
#define LMDB_CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \
         "%s:%d: %s: %s\n", __FILE__, __LINE__, msg, mdb_strerror(test)), abort()))

Resultado dos testes

         Finalmente, compilamos / obtemos o programa e obtemos o seguinte resultado.

 

         Gere arquivos de dados e bloqueie arquivos nos diretórios relevantes.

zglinux cvtest # ls -lrth /home/zhaogang/code_my/lmdb/
total 32K
---------- 1 root root 192 5月  27 21:29 lock.mdb
---------- 1 root root 16M 5月  27 21:29 data.mdb
zglinux cvtest #

O resultado mostra: o teste está correto.

Descrição estendida

  1. LMDB distingue diferentes instâncias de banco de dados por meio de DBI e suporta o armazenamento de várias instâncias de banco de dados em um arquivo de dados;
  2. LMDB é uma biblioteca de banco de dados de código aberto leve, comumente usada em ambientes integrados com hardware limitado e não oferece suporte a instruções SQL ;
  3. LMDB mapeia arquivos para o espaço de endereço virtual do processo por meio de mmap, que pode acelerar o acesso ao banco de dados;
  4. O LMDB usa o algoritmo de árvore B + para armazenar dados e pode acessar facilmente dados em diferentes locais por meio do cursor;
  5. O armazenamento / busca de dados do LMDB adota o tipo void comum na linguagem C, e a análise de tipo é feita pelo programador, proporcionando maior flexibilidade ;

Resumindo

         O código-fonte do LMDB é de 12 K. Os leitores que desejam saber mais sobre sua implementação podem consultar seu código-fonte. O código-fonte também fornece vários casos de teste, como mtest, mtest2 ~ mtest6, etc. para referência.

Acho que você gosta

Origin blog.csdn.net/zhaogang1993/article/details/90612646
Recomendado
Clasificación