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 !

  • 相关阅读:
    I.MX6 Surfaceflinger 机制
    理解 Android Fragment
    RPi 2B DDNS 动态域名
    RPi 2B IPC webcam server
    理解 Android MVP 开发模式
    I.MX6 system.img unpack repack
    can't set android permissions
    VMware Ubuntu 共享文件夹
    解决oracle数据库连接不上的问题
    perfect-scrollbar示例
  • 原文地址:https://www.cnblogs.com/FunTester/p/15561513.html
Copyright © 2011-2022 走看看