leveldb中WriteBatch、Snapshot使用
leveldb中WriteBatch、Snapshot使用
上一节中仅仅做了一个leveldb的介绍,以及简单的put、get、del的使用,没有对leveldb的一些深入的特性进行讲解,算得上只是一个入门罢了,知道什么是leveldb,而作为一个基础的存储引擎,本身没有太多的特性其实也是正常的,如果想要在生产环境使用一个类似的存储,其实还是更推荐使用mapdb,有着相当丰富的特性供以使用,我有一个专栏专门讲mapdb操作以及源码分析的,以后可以关注下,言归正传还是回到leveldb中,我想这次就不将BatchWrite、Snapshot等分开写了,因为也没啥可写的,简单几行代码就演示完了,因此这篇文章将这几种API的用法一次性讲完,下一篇直接开始分析源码。
BatchWrite用法
其实在这里也需要提一下上一篇文章中提到的WriteOption和ReadOption,这里不单独拿出来讲解用法,在讲述这些API的使用的时候也会用到,到时一起说一下。
获取BatchWrite是通过DB类的createWriteBatch方法,BatchWrite使用中就只有两个用法,put和delete,如下:
以下是一段BatchWrite的基本用法:
String path = "/data/leveldb";
DBFactory factory = new Iq80DBFactory();
Options options = new Options();
options.createIfMissing(true);
DB db = factory.open(new File(path), options);
WriteBatch writeBatch = db.createWriteBatch();
writeBatch.put(bytes("key1"), bytes("value1"));
System.out.println(asString(db.get(bytes("key1"))));
writeBatch.put(bytes("key2"), bytes("value2"));
db.write(writeBatch);
System.out.println(asString(db.get(bytes("key1"))));
System.out.println(asString(db.get(bytes("key2"))));
BatchWrite也就是批量写入,在以上两个put操作中,还进行了一次取value的操作,然后最后进行一次性批量写入,最后再查询这两个key是否存在,以下是程序运行结果:
在第一次取的时候取的值为null,在第二次取值的时候成功取到值,这里BatchWrite是在最后提交的时候才会将一系列put操作的kv存储到缓存之中。
Snapshot用法
leveldb的快照,其实leveldb快照的主要功能就是用来读取某一个时间点之前的数据,在leveldb插入数据的时候,键值可以是一样的,所以在查询这个键值的时候,系统会返回最新的数据,但是如果在后一次插入之前,给前面的插入建立一个快照,那么这个时候读取这个快照的时候,读取的就是这个快照时间点之前的数据。以下就开始Snapshot的用法,不多说,还是先写一段用法,然后再来讲解,代码如下:
import org.iq80.leveldb.*;
import org.iq80.leveldb.impl.Iq80DBFactory;
import java.io.File;
import java.io.IOException;
/**
* @author xiaxuan
* @date 2018/4/7.
*/
public class SnapshotTest02 {
public static void main(String[] args) throws IOException {
String path = "/data/leveldb";
DBFactory factory = new Iq80DBFactory();
Options options = new Options();
options.createIfMissing(true);
DB db = factory.open(new File(path), options);
WriteOptions writeOptions = new WriteOptions();
db.put(Iq80DBFactory.bytes("key"), Iq80DBFactory.bytes("value" + 1), writeOptions);
ReadOptions readOptions = new ReadOptions();
Snapshot snapshot = db.getSnapshot();
readOptions.snapshot(snapshot);
String value2 = "value2";
db.put(Iq80DBFactory.bytes("key"), Iq80DBFactory.bytes(value2), new WriteOptions());
byte[] value = db.get(Iq80DBFactory.bytes("key"), new ReadOptions());
System.out.println(Iq80DBFactory.asString(value));
byte[] value3 = db.get(Iq80DBFactory.bytes("key"), readOptions);
System.out.println(Iq80DBFactory.asString(value3));
snapshot.close();
db.close();
}
}
这个程序很简单,就是最最开始的时候插入一条记录,然后取出当前的db的快照,然后再覆盖先前的kv值,再查询当前的kv值,为最新覆盖后的值,然后通过Snapshot读出之前的值,代码运行效果如下:
通过Snapshot取出的就是之前的被覆盖的旧值,其实也好理解,这里的Snapshot应该就是返回当前最新版本的一个切面数据,方便用来查看某一时的数据使用。
综上
其实只是讲用法的话,其实没有太多可以讲的,leveldb只是一个基础存储引擎,没有太多新奇的特性,只有最基础的API,因此翻来覆去基本就是这几个玩意,所以对用法就暂时讲到这,下一节从底层源码分析。
上一篇: 使用PyTorch构建线性回归模型