首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >LevelDB Java&Go实践

LevelDB Java&Go实践

作者头像
FunTester
发布2021-11-19 14:22:20
发布2021-11-19 14:22:20
8790
举报
文章被收录于专栏:FunTesterFunTester

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

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

levelDB简介

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

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

Java

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

依赖

Maven:

代码语言:javascript
复制
<!-- https://mvnrepository.com/artifact/org.iq80.leveldb/leveldb -->
<dependency>
    <groupId>org.iq80.leveldb</groupId>
    <artifactId>leveldb</artifactId>
    <version>0.12</version>
</dependency>

Gradle:

代码语言:javascript
复制
// https://mvnrepository.com/artifact/org.iq80.leveldb/leveldb
implementation group: 'org.iq80.leveldb', name: 'leveldb', version: '0.12'

基本操作

打开一个数据库文件:

代码语言:javascript
复制
        Iq80DBFactory factory = Iq80DBFactory.factory;
        Options options = new Options();
        DB db = factory.open(new File("fun"), options);

添加一个key和value:

代码语言:javascript
复制
        db.put(bytes("scores"), bytes("scoreJSON.toString())"));

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

获取一个key的value:

代码语言:javascript
复制
        byte[] scores = db.get(bytes("scores"));

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

删除一个key:

代码语言:javascript
复制
db.delete(bytes("fun"));

遍历数据库:

代码语言:javascript
复制
        DBIterator iterator = db.iterator();
        while (iterator.hasNext()) {
            Map.Entry<byte[], byte[]> next = iterator.next();
            output(next.getKey());
        }

关闭数据库:

代码语言:javascript
复制
        db.close();

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

Go

依赖

代码语言:javascript
复制
 github.com/syndtr/goleveldb v1.0.0

基础操作

基本操作

打开一个数据库文件:

代码语言:javascript
复制
 db, err := leveldb.OpenFile("funtester", nil)
 if err != nil {
  log.Println("创建出错!", err)
 }

添加一个key和value:

代码语言:javascript
复制
 db.Put([]byte(task.FunTester), fun, nil)

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

获取一个key的value:

代码语言:javascript
复制
 get, er := db.Get([]byte(task.FunTester), nil)

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

删除一个key:

代码语言:javascript
复制
 db.Delete([]byte("test"), nil)

遍历数据库:

代码语言:javascript
复制
 iterator := db.NewIterator(nil, nil)
 for iterator.Next() {
  key := iterator.Key()
  value := iterator.Value()
  log.Printf("数据key:%s,value:%s", key, value)
 }

关闭数据库:

代码语言:javascript
复制
 db.Close()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • levelDB简介
  • Java
    • 依赖
    • 基本操作
  • Go
    • 依赖
    • 基础操作
    • 基本操作
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档