Java LevelDB 初体验

本贴最后更新于 2115 天前,其中的信息可能已经斗转星移

前言

LevelDB 是一种Key-Value存储数据库
性能非常强悍 百度百科上介绍 可以支撑十亿级
这段时间在研究区块链的时候发现的这个数据库

引入 SDK

<dependency>
	<groupId>org.iq80.leveldb</groupId>
	<artifactId>leveldb-api</artifactId>
	<version>0.10</version>
</dependency>
<dependency>
	<groupId>org.iq80.leveldb</groupId>
	<artifactId>leveldb</artifactId>
	<version>0.10</version>
</dependency>

初始化 DB

DBFactory factory = new Iq80DBFactory();
Options options = new Options();
options.createIfMissing(true);
//folder 是db存储目录
DB db = factory.open(new File(folder), options);

存储 Key Value 值

//levelDB 的api存储都是字节数组  所以这里需要转成字节数组
db.put(Iq80DBFactory.bytes(key), Iq80DBFactory.bytes(value));

获取 Value

byte[] bytes = db.get(Iq80DBFactory.bytes(key));
String value = Iq80DBFactory.asString(bytes);

删除 | 更改

//删除
db.delete(Iq80DBFactory.bytes(key));

//更改 重新put新的key - value即可
db.put(Iq80DBFactory.bytes(key), Iq80DBFactory.bytes(value));	

遍历所有数据

public LinkedHashMap<String, String> iteratorDb() {
    DBIterator iterator = db.iterator();
    LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
    while (iterator.hasNext()) {
        Map.Entry<byte[], byte[]> next = iterator.next();
        String key = Iq80DBFactory.asString(next.getKey());
        String value = Iq80DBFactory.asString(next.getValue());
        linkedHashMap.put(key, value);
    }
    return linkedHashMap;
}

测试插入一百万条数据

基于 SpringBoot 搭建的控制器

随机生成 指定数量的 UUID 并且插入到 LevelDB

从请求 到响应 5.5 秒左右 如果再抛掉生成 UUID 的时间 可能更快 哈哈

@ResponseBody
@GetMapping("/generate")
public ResponeEntity generate(Long count) {
    DB db = levelDb.getDb();
    //创建批量处理
    WriteBatch batch = db.createWriteBatch();
    for (int i = 0; i < count; i++) {
        String uuid = UUID.randomUUID().toString();
        batch.put(Iq80DBFactory.bytes(uuid), Iq80DBFactory.bytes(uuid));
    }
    //执行写入
    db.write(batch);
    return buildRespone(null);
}

测试从一百万数据中取出一条

PostMan 请求到响应时间 19 毫秒

@ResponseBody
@GetMapping("/getLevel")
public ResponeEntity getLevel(String key) {
    byte[] bytes = db.get(Iq80DBFactory.bytes(key));
    String value = Iq80DBFactory.asString(bytes);
    return buildRespone(value);
}	

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 286 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖
  • LevelDB
    1 引用 • 5 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • hkpqazwsxedc

    强悍

  • linken

    一百万竟然要 19 毫秒,这速度还不如 sqlite 这种数据库好嘛。。。

    1 回复
  • pencilso

    是吗.... 没测过 sqlite ...

  • pencilso

    今天试了一下,LevelDB 一亿条数据,随机查询在 500-600 毫秒左右。

  • pencilso

    刚刚又跑去测试了一下 Mysql,一亿条数据的话,主键,随机查询在 0.03 秒左右 ....