精华内容
下载资源
问答
  • 2021-11-07 18:01:42

    1. leveldb简介:

    优点

    1. leveldb是一个开源持久化键值数据库

    2.具有很高的随机写,顺序读写性能,但是随机读性能一般,适合写多读少的场景。在一台4核Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。

    3.key和value都是任意长度字节数组

    4.支持批量操作以原子操作形式进行

    5.支持全景快照

    6.非内存数据库

     缺点

    1)leveldb但是没有提供服务器接口,也就意味着只能本地使用,开发者也可以自己封装一个服务器接口。

    2)一次只允许一个进程访问

    2. python安装leveldb

    pip install cython  #plyvel需要用到c环境

    pip install plyvel   #python连接leveldb模型

    pip install leveldb #安装leveldb模块

    3. python操作leveldb数据库:

    import leveldb
    
    db=leveldb.LevelDB("./data") #创建或者打开data数据库
    
    db.Put(b"name",b"xiaoming")   #增加或修改
    
    db.Get(b"name")               #获取
    
    db.Delete("name")           #删除
    
    
    
    iter_db=leveldb.Iterator(db)
    
    for  item in iter_db:
    
            print(item)
    
    #iter_db.Next()
    
    #iter_db.Key()

    更多相关内容
  • db , err := leveldb . OpenFile ( "path/to/db" , nil ) ... defer db . Close () ... 读取或修改数据库内容: // Remember that the contents of the returned slice should not be modified. data , ...
  • 一个用Java编写的简单程序,可以快速查找LevelDB数据库。 因为此程序使用Intellij平台的GUI设计器,所以您应使用Intellij IDEA或包括Intellij GUI设计器的库来进行构建。 通过使用此程序,您应该同意这些许可 This...
  • 为您提供LevelDB数据库下载,LevelDB数据库是Google编写的一个快速键值存储库,它提供了从字符串键到字符串值的有序映射,调用者可以提供一个自定义比较函数来覆盖排序顺序。功能介绍 键和值是任意的字节数组。 ...
  • 这是一个适用于arm32架构的php模块, leveldb数据库懂得都懂 下载文件中含一个压缩包(这是源码,同样含有编译样例) 一个 leveldb.so文件 这是我编译的自己用的leveldb模块,试过了php7.3使用正常 还有一个txt文件...
  • LevelDB数据库-其他

    2021-06-12 00:07:34
    LevelDB是Google编写的快速键值存储库,提供了从字符串键到字符串值的有序映射。 特征: 键和值是任意字节数组。 数据按键存储。 调用者可以提供自定义比较功能来覆盖排序顺序。 的基本操作是Put(key,value),Get...
  • 如何访问leveldb数据库内容当fabric的状态数据库设置为leveldb的时候(也是缺省设置),那么状态数据是存储在leveldb里面的;本文给出一个简单go语言例子,直接读取leveldb的内容。在peer容器里面leveldb的缺省存着...

    如何访问leveldb的数据库内容

    当fabric的状态数据库设置为leveldb的时候(也是缺省设置),那么状态数据是存储在leveldb里面的;本文给出一个简单go语言例子,直接读取leveldb的内容。

    在peer容器里面leveldb的缺省存着路径是

    /var/hyperledger/production/ledgersData/stateLeveldb

    包含下面类似内容:

    $ ls -l

    -rw-r--r-- 1 root root 5122 Aug 20 15:03 000006.log

    -rw-r--r-- 1 root root 16 Aug 20 14:56 CURRENT

    -rw-r--r-- 1 root root 0 Aug 20 14:45 LOCK

    -rw-r--r-- 1 root root 1842 Aug 20 14:56 LOG

    -rw-r--r-- 1 root root 41 Aug 20 14:56 MANIFEST-000007

    第一步:准备leveldb第三方库

    可以直接从官网下载

    $ go get github.com/syndtr/goleveldb/leveldb

    或者不下载直接引用fabric里面的库也可以,因为fabric包里面已经嵌入了。

    路径在:fabric/vendor/github.com/syndtr/goleveldb/leveldb

    第二步,编写测试程序如下

    $ cat main.go

    package main

    import (

    "fmt"

    "flag"

    "bytes"

    "strings"

    "github.com/syndtr/goleveldb/leveldb"

    )

    var (

    channel string

    chaincode string

    key string

    dbpath string

    )

    func init() {

    flag.StringVar(&channel, "channel", "mychannel", "Channel name")

    flag.StringVar(&chaincode, "chaincode", "mychaincode", "Chaincode name")

    flag.StringVar(&key, "key", "", "Key to query; empty query all keys")

    flag.StringVar(&dbpath, "dbpath", "", "Path to LevelDB")

    }

    func readKey(db *leveldb.DB, key string) {

    var b bytes.Buffer

    b.WriteString(channel)

    b.WriteByte(0)

    b.WriteString(chaincode)

    b.WriteByte(0)

    b.WriteString(key)

    value, err := db.Get(b.Bytes(), nil)

    if err != nil {

    fmt.Printf("ERROR: cannot read key[%s], error=[%v]\n", key, err)

    return

    }

    fmt.Printf("Key[%s]=[%s]\n", key, string(value))

    }

    func readAll(db *leveldb.DB) {

    var b bytes.Buffer

    b.WriteString(channel)

    b.WriteByte(0)

    b.WriteString(chaincode)

    prefix := b.String()

    iter := db.NewIterator(nil, nil)

    for iter.Next() {

    key := string(iter.Key())

    if strings.HasPrefix(key, prefix) {

    value := string(iter.Value())

    fmt.Printf("Key[%s]=[%s]\n", key, value);

    }

    }

    iter.Release()

    //err := iter.Error()

    }

    func main() {

    flag.Parse()

    if channel == "" || chaincode== "" || dbpath == "" {

    fmt.Printf("ERROR: Neither of channel, chaincode, key nor dbpath could be empty\n")

    return

    }

    db, err := leveldb.OpenFile(dbpath, nil)

    if err != nil {

    fmt.Printf("ERROR: Cannot open LevelDB from [%s], with error=[%v]\n", dbpath, err);

    }

    defer db.Close()

    if key == "" {

    readAll(db)

    } else {

    readKey(db, key)

    }

    }

    这个代码例子给出了一个读取单个key,和遍历所有key的例子:

    以sample02为例子,如果输入key=a,那么返回a的值,如果没有输入key,那么返回所有的key,在我们例子中只有有a和b两个key。

    $ ./testleveldb -key a -dbpath /var/hyperledger/production/ledgersData/stateLeveldb

    Key[a]=[��1001]

    $ ./testleveldb -dbpath /var/hyperledger/production/ledgersData/stateLeveldb

    Key[mychannelmychaincodea]=[��1001]

    Key[mychannelmychaincodeb]=[��1999]

    多说两句:

    我们看到value的值有乱码"��1001",其中1001是值,前面的乱码用在其他用处,例如版本信息等;因为我们使用leveldb的原始工具查询出来的是原始值,而fabric内部是有完整的数据结构类型定义来描述value或者key字段的每一个字节的含义。

    从代码里我们也看到key的值实际是由channel+'\0'+chaincode+'\0'+key组成。

    另外整个数据库还有其他的信息,不止是用户数据,还有metadata数据。我们遍历的时候,如果打印出所有的key,会看到:

    key=[mychannel]

    key=[mychannelresourcesconfigtx.CHANNEL_CONFIG_KEY]

    key=[mychannellsccmychaincode]

    key=[mychannelmychaincodea]

    key=[mychannelmychaincodeb]

    有包含channel的metadata信息,以及chaincode的metadata信息。(注意虽然我们看到的都是字符串,实际上他们都包含不可显示的字符的)

    附录:LevelDB的修改和删除

    func DBPutKey(db *leveldb.DB, key string, value []byte) error {

    var k bytes.Buffer

    k.WriteString(key)

    err := db.Put(k.Bytes(), value, nil)

    if err != nil {

    return err

    }

    return nil

    }

    func DBDelKey(db *leveldb.DB, key string) error {

    var k bytes.Buffer

    k.WriteString(key)

    err := db.Delete(k.Bytes(), nil)

    if err != nil {

    return err

    }

    return nil

    }

    展开全文
  • leveldb产生的文件无法直观查看,写了以下简单的工具使用命令行对leveldb进行直观的查看,包含简单的功能:增删查改,具体用法可看--help #include "leveldb/db.h" #include <iostream> #include <...

     leveldb产生的文件无法直观查看,写了以下简单的工具使用命令行对leveldb进行直观的查看,包含简单的功能:增删查改,具体用法可看--help

    #include "leveldb/db.h"
    
    #include <iostream>
    #include <unistd.h>
    #include <getopt.h>
    #include <string>
    
    using namespace std;
    using namespace leveldb;
    
    enum EDB_OPT
    {
      PUT = 0,
      GET,
      DEL,
      ITE
    };
    
    void printUsage()
    {
    
      printf("【usage】:\n");
    
      printf("-n --dbname <dbname> 数据库名称\n");
      printf("-p --put 插入\n");
      printf("-g --get 查询\n");
      printf("-d --delete 删除\n");
      printf("-i --iterator 遍历所有kv\n");
      printf("-k --key <key>\n");
      printf("-v --value <value>\n");
      printf("-h --help \n");
    }
    
    void db_put(string dbName, string key, string value)
    {
      leveldb::DB *db;
      leveldb::Options options;
      options.create_if_missing = true;
      leveldb::Status status = leveldb::DB::Open(options, dbName, &db);
      if (!status.ok())
      {
        cout << "打开数据失败:dbName:" << dbName << endl;
        return;
      }
      status = db->Put(WriteOptions(), key, value);
    
      if (!status.ok())
      {
        cout << "put操作失败" << endl;
      }
      else
      {
        cout << "put操作成功" << endl;
      }
      delete db;
    }
    
    void db_get(string dbName, string key)
    {
      leveldb::DB *db;
      leveldb::Options options;
      options.create_if_missing = true;
      leveldb::Status status = leveldb::DB::Open(options, dbName, &db);
      if (!status.ok())
      {
        cout << "打开数据失败:dbName:" << dbName << endl;
        return;
      }
      string res;
      status = db->Get(ReadOptions(), dbName, &res);
    
      if (!status.ok())
      {
        cout << "get操作失败" << endl;
      }
      else
      {
        cout << "get操作成功,查询结果:" << res << endl;
      }
      delete db;
    }
    
    void db_del(string dbName, string key)
    {
      leveldb::DB *db;
      leveldb::Options options;
      options.create_if_missing = true;
      leveldb::Status status = leveldb::DB::Open(options, dbName, &db);
      if (!status.ok())
      {
        cout << "打开数据失败:dbName:" << dbName << endl;
        return;
      }
      status = db->Delete(WriteOptions(), key);
    
      if (!status.ok())
      {
        cout << "del操作失败" << endl;
      }
      else
      {
        cout << "del操作成功" << endl;
      }
      delete db;
    }
    
    void db_iterator(string dbName)
    {
      leveldb::DB *db;
      leveldb::Options options;
      leveldb::Status status = leveldb::DB::Open(options, dbName, &db);
      if (!status.ok())
      {
        cout << "打开数据失败:dbName:" << dbName << endl;
        return;
      }
      leveldb::Iterator *it = db->NewIterator(leveldb::ReadOptions());
      for (it->SeekToFirst(); it->Valid(); it->Next())
      {
        cout << "查找到kv对! " << it->key().ToString() << ":" << it->value().ToString() << endl;
      }
    }
    
    int main(int argc, char **argv)
    {
      int opt;
      int digit_optind = 0;
      int option_index = 0;
      char *strings = "a::b:c:d";
      static struct option long_options[] = {
          {"dbname", required_argument, NULL, 'n'},
          {"put", no_argument, NULL, 'p'},
          {"get", no_argument, NULL, 'g'},
          {"delete", no_argument, NULL, 'd'},
          {"iterator", no_argument, NULL, 'i'},
          {"key", required_argument, NULL, 'k'},
          {"value", required_argument, NULL, 'v'},
          {"help", no_argument, NULL, 'h'},
          {NULL, 0, NULL, 0},
      };
    
      string dbName;
      EDB_OPT opcode;
      string key;
      string value;
    
      while ((opt = getopt_long_only(argc, argv, strings, long_options, &option_index)) != -1)
      {
        if (opt == 'n')
        {
          dbName = optarg;
        }
        if (opt == 'k')
        {
          key = optarg;
        }
        if (opt == 'v')
        {
          value = optarg;
        }
        if (opt == 'g')
        {
          opcode = GET;
        }
        if (opt == 'p')
        {
          opcode = PUT;
        }
        if (opt == 'd')
        {
          opcode = DEL;
        }
        if (opt == 'i')
        {
          opcode = ITE;
        }
    
        if (opt == 'h')
        {
          printUsage();
          exit(0);
        }
      }
    
      cout << "dbName:" << dbName << endl;
      cout << "opcode(0-PUT,1-GET,2-DEL,3-ITE):" << opcode << endl;
      cout << "key:" << key << endl;
      cout << "value:" << value << endl;
    
      if (opcode == PUT)
      {
        db_put(dbName, key, value);
      }
      else if (opcode == GET)
      {
        db_get(dbName, key);
      }
      else if (opcode == DEL)
      {
        db_del(dbName, key);
      }
      else if (opcode == ITE)
      {
        db_iterator(dbName);
      }
      else
      {
        printUsage();
      }
    
      return 0;
    }

     

    展开全文
  • 这是Go编程语言中LevelDB键/值数据库的实现。 安装获取get github.com/syndtr/goleveldb/leveldb要求至少需要go1.4或更高版本。 用法这是Go编程语言中LevelDB键/值数据库的实现。 安装获取get github....
  • 数据库 基于leveldb的kv数据库
  • 下面的代码功能实现了完整的打开和关闭数据库的功能,下面会对代码来进行逐一讲解: #include &amp;amp;lt;iostream&amp;amp;gt; #include &amp;amp;lt;cassert&amp;amp;gt; #inc...

    简介

    LevelDB提供持久键值存储功能。键和值是任意字节数组。根据用户指定的比较函数,在键值存储区内对键进行排序。
    本文将介绍LevelDB的打开和关闭数据的基本操作,为后面的键值存储操作做准备。

    代码示例

    下面的代码功能实现了完整的打开和关闭数据库的功能,下面会对代码来进行逐一讲解:

    #include <iostream>
    #include <cassert>
    #include <leveldb/db.h>
    
    int main(int argc, const char *argv[])
    {
        leveldb::DB *db;
        leveldb::Options options;
        options.create_if_missing = true;
        
        leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
        assert(status.ok());
    
        std::cout << "Hello, world with leveldb in it!\n";
    
        delete db;
    
        return 0;
    }
    

    打开数据库

    LevelDB数据库具有一个与文件系统目录对应的名称。数据库的所有内容都存储在此目录中。下列的代码中展示如何打开一个LevelDB数据库,必要时创建它:

    #include <cassert>
    #include "leveldb/db.h"
    
    leveldb::DB* db;
    leveldb::Options options;
    options.create_if_missing = true;
    
    leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
    assert(status.ok());
    

    如果要在数据库已存在时引发错误(raise an error),请在leveldb :: DB :: Open调用之前添加以下行:

    options.error_if_exists = true;
    

    关闭数据库

    在使用完数据库之后,需要删除数据库对象:

    ... open the db as described above ...
    ... do something with db ...
    delete db;
    

    Status操作结果

    您可能已经注意到上面的leveldb :: Status类型。 LevelDB中的大多数函数都会返回此类型的值您可以检查这样的结果是否正常,还打印相关的错误消息:

    leveldb::Status s = ...;
    if (!s.ok()) cerr << s.ToString() << endl;
    

    编译执行

    在Linux下,通过下面的命令可以对程序进行编译链接:

    gcc -o test test.cpp  -L/usr/local/lib/ -lleveldb -lstdc++
    

    编译链接后会生成test可执行文件,执行时能够输出上面的"Hello World"信息。

    展开全文
  • C#读取LevelDB数据

    2016-06-21 13:38:22
    WPF下使用现有类库读取LevelDB数据库,且解析JSON字符串并显示 test_db 测试使用的LevelDB数据库 数据为JSON字符串
  • Fabric 1.0源代码笔记 之 LevelDB(KV数据库) 1、LevelDB概述 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,...
  • Fabric 1.0源代码笔记 之 LevelDB(KV数据库) 1、LevelDB概述 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB很适合应用在查询较少,而写...
  • Google LevelDb高速数据库的架构详解

    千次阅读 2018-06-23 22:47:17
    备注:博文参考了郎格科技博客:http://www.samecity.com/blog/Index.asp?SortID=12 LevelDb就是这两位大神级别的工程师发起的开源项目,简而言之,LevelDb是能够处理十亿级别规模Key-Value型数据持久性存储的C++ ...
  • leveldb是key-value类型的数据库,因此要进行某个value的查询,必须知道key才行,如此也就限制了leveldb无法进行条件查询,分区,分组,排序等操作。本文来看看仅有的Get操作是如何做的。先看Get函数入口 func (db ...
  • 之前的leveldb总结分享中说到了三个关键部分,数据的Put,Get,compaction。其中put操作实现了数据的增删改功能,Get操作实现了数据的查功能。本文从源码角度说明下put操作的相关流程。 put接口位于leveldb的db_write...
  • leveldb:数据库recover机制

    千次阅读 2017-09-19 14:12:33
    DBImpl::Recover把数据库恢复到上次退出的状态,Recover的基本功能是:首先是处理创建flag,比如存在就返回失败等等;然后是尝试从已存在的sstable文件恢复db;最后如果发现有大于原信息记录的log编号的log文件,则...
  • 虽然归属NoSQL,但Hamsterdb却是单线程和非分布式的。同时虽然使用了键值类型存储,但其特性却更偏向于列式存储。更重要的是,它还支持read-committed隔离级别的事务。...那么对比LevelDB,Hamsterdb又会有
  • Jeff Dean 和 Sanjay Ghemawat 两位超级大神实现的高效 kv 数据库
  • tinydb:TinyDB-基于LevelDB的快速NoSQL数据库,是Memcached的替代方法
  • 水平花哨 用于连接到客户端。 地位 工作正在进行中。 用法 使用默认设置连接客户端 var Client = require('level-fancy').Client var client = new Client() var db = client.connect().db 使用自定义设置连接 ...
  • LevelDB 是一个由 Google 公司所研发的 K-V 存储嵌入式数据库管理系统编程库,以开源的 BSD 许可证发布。其作为 LSM Tree 的经典实现,具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,LevelDB...
  • LevelDB-总体介绍

    2022-01-27 20:12:51
    LevelDB数据库中,在进行操作过程中,先往memtable中进行写入,当memtable没有空间时,将memtable写入immutable,然后memtable申请新的内存空间,单独有一个后台线程将imutable进行落盘成sstable。所有磁盘数据...
  • 嵌入式数据库是轻量级的,独立的库,没有服务器组件,无需管理,一个小的代码尺寸,以及有限的资源需求。目前有几种嵌入式数据库,你可以在移动应用程序中使用。让我们来看看这些最流行的数据库。 BerkeleyDB ...
  • 前言LevelDB 是一种Key-Value存储数据库百度百科上介绍 性能非常强悍 可以支撑十亿级这段时间在研究区块链的时候发现的这个数据库LevelDB 是单进程的服务,性能非常之高,在一台4核Q6600的CPU机器上,每秒钟写数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,405
精华内容 4,562
关键字:

leveldb 类似的数据库