leveldb入门

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012734441/article/details/79797684

leveldb入门

leveldb简介

以前在大学的时候偶尔了解过leveldb,当时只是知道leveldb是一个存取性能极强的存储引擎,非常适合于顺序存储,当时时间不多,有很多其他的需要去学习,另外也没没有用到,因此一直没有了解过,最近有一些功夫突然再次看到了leveldb,想接触一下,然后发现这个是C++编写的,原生不支持java,但是有一个开发者照着C++的源码编写了一个java版,性能损耗是C++的10%左右,然后activemq在持久化存储消息的时候就是用的这个,说明本身是可靠的,可以看看,leveldb java源码地址为:leveldb源码地址,最新的更新时间是三个月前,单一的开发者,更新确实不多,但是可以研究看看,于是决定这次还是研究一下用饭,看一下源码,找了几个demo,然后我发现大多数的demo运用基本都是C++的,没有java版本的,而且深入度很低,因此,我决定开一个专栏写一个leveldb系列。

api使用


leveldb在maven中央仓库中有最新的依赖,版本如下:

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

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

引入这两个包就可以进行demo编写了,这两个包基本就是leveldb的源码,查看源码的时候可以就只看这两个包。

核心类DB


leveldb的核心使用类就是DB类,初始化DB类也非常简单,具体代码如下:

String path = "/data/leveldb";
DBFactory factory = new Iq80DBFactory();
Options options = new Options();
options.createIfMissing(true);
DB db = factory.open(new File(path), options);

这里的path是指生成的文件的路径,leveldb最终还是要将数据持久化存储到文件中,leveldb会生成一系列文件,这个可以以后讲到源码的时候再来详细讲述,暂时不需要理会。

get、set、delete使用


DB类中的方法使比较容易使用和易懂的,这里展示一个非常简单的存储、查询、delete demo,操作代码如下:

db.put(Iq80DBFactory.bytes("key01"), Iq80DBFactory.bytes(String.valueOf(System.currentTimeMillis())));
String value = Iq80DBFactory.asString(db.get(Iq80DBFactory.bytes("key01")));
System.out.println(value);
db.delete(Iq80DBFactory.bytes("key01"));

api的使用和其他缓存框架的使用基本相同,就是提供的api较少,作为一款基础的存储引擎,大多数都是在在表层进行相关封装然后使用,所以api少也是正常的,所以这里也需要提一下RocksDB,这款存储引擎实际上就是在leveldb上面的一层封装,支持的特性比较多,跨语言提供的client包也比较多,因此有兴趣的可以去看下这个开源存储引擎的使用。

上述write方法中还有一个重载可以传一个WriteOption,用法为:

WriteOptions writeOptions = new WriteOptions().sync(true);
db.put(bytes("key-001"), bytes("xiaohong"), writeOptions);

这里的sync其实也就是在写入的时候,不只是写入到内存中,同时也会同步写入到文件中持久化存储。

与put相对的get类似的重载方法,传入的参数与put类似,为ReadOption,但是这个用法涉及到snapshot等等,日后讲snapshot时再来讲述这些。

关闭db


在db进行相关操作完了后一定需要关闭db,代码为:

db.close();

可以看下DB类的实现,如下:

public interface DB
        extends Iterable<Map.Entry<byte[], byte[]>>, Closeable
{
}

这里继承了Closeable接口,db本身也是相当于使用了系统底层资源,如果不进行close操作,最终会造成系统底层资源紧张,最终系统服务不可用的情况。

综上


leveldb的用法还是挺单一的,从上面代码中可以看出,都是一些基本用法,复杂的用法不多,因此在之后在讲完,之后再讲几篇leveldb的用法之后,更多的是对leveldb源码上的分析。

猜你喜欢

转载自blog.csdn.net/u012734441/article/details/79797684