zoukankan      html  css  js  c++  java
  • LevelDB Java&Go实践

    最近学习出现了一个分叉:levelDB,前进的路上总有意外,经过短暂学习已经掌握了基本使用,并没有阻碍太长时间。

    今天就分享一下levelDB API在Java & Go两种语言中的基本使用。体验下来levelDB像是个简化版本的Redis,如果作为本地数据库的话,还是非常好用的,特别是用到本地缓存的时候。官方给的使用场景是适合大量写入少量读取,特别适合做性能测试数据记录。以后有机会我会做一个基于levelDB的性能测试数据收集工具。

    levelDB简介

    LevelDB 是由 Google 构建的键/值存储。它可以支持从字符串键到字符串值的有序映射。LevelDB 的核心存储架构是日志结构合并树(LSM),它是一种写优化的 B 树变体。它针对大型顺序写入而不是小型随机写入进行了优化。

    PS:其实在使用依赖库进行levelDB操作的时候并不需要安装levelDB,这个弯路阻碍了我将近一个小时。

    Java

    虽然说是Java,但是Groovy也可以这么用,为了使更容易阅读,我只分享Java的使用。

    依赖

    Maven:

    <!-- https://mvnrepository.com/artifact/org.iq80.leveldb/leveldb -->
    <dependency>
        <groupId>org.iq80.leveldb</groupId>
        <artifactId>leveldb</artifactId>
        <version>0.12</version>
    </dependency>
    
    

    Gradle:

    // https://mvnrepository.com/artifact/org.iq80.leveldb/leveldb
    implementation group: 'org.iq80.leveldb', name: 'leveldb', version: '0.12'
    
    

    基本操作

    打开一个数据库文件:

            Iq80DBFactory factory = Iq80DBFactory.factory;
            Options options = new Options();
            DB db = factory.open(new File("fun"), options);
    

    添加一个key和value:

            db.put(bytes("scores"), bytes("scoreJSON.toString())"));
    

    这里用到了org.iq80.leveldb.impl.Iq80DBFactory#bytes这个方法,当然也可以自己封装一个方法。

    获取一个key的value:

            byte[] scores = db.get(bytes("scores"));
    

    返回值也是数组,还需要进一步转化成我们目标对象。

    删除一个key:

    db.delete(bytes("fun"));
    

    遍历数据库:

            DBIterator iterator = db.iterator();
            while (iterator.hasNext()) {
                Map.Entry<byte[], byte[]> next = iterator.next();
                output(next.getKey());
            }
    

    关闭数据库:

            db.close();
    
    

    然后我们就能在当前目录下看到fun目录下有一堆文件:后缀为sst以及CURRENT、LOCK等等。

    Go

    依赖

    	github.com/syndtr/goleveldb v1.0.0
    

    基础操作

    基本操作

    打开一个数据库文件:

    	db, err := leveldb.OpenFile("funtester", nil)
    	if err != nil {
    		log.Println("创建出错!", err)
    	}
    

    添加一个key和value:

    	db.Put([]byte(task.FunTester), fun, nil)
    

    这里建议自己封装一个方法。

    获取一个key的value:

    	get, er := db.Get([]byte(task.FunTester), nil)
    

    返回值也是数组,还需要进一步转化成我们目标对象。

    删除一个key:

    	db.Delete([]byte("test"), nil)
    

    遍历数据库:

    	iterator := db.NewIterator(nil, nil)
    	for iterator.Next() {
    		key := iterator.Key()
    		value := iterator.Value()
    		log.Printf("数据key:%s,value:%s", key, value)
    	}
    
    

    关闭数据库:

    	db.Close()
    

    欢迎关注FunTester,Have Fun ~ Tester !

  • 相关阅读:
    crontab使用
    python 学习 第一课
    php调用阿里大鱼 接口curl
    thinkphp 动态 级联
    nginx重启
    linux查看 文件夹大小
    mysql convert
    mysql 数据库导入 导出,解决 导入 错误问题
    .net 更新数据 ado.net parameter
    PHP的超全局变量$_SERVER
  • 原文地址:https://www.cnblogs.com/FunTester/p/15561513.html
Copyright © 2011-2022 走看看