欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leveldb中WriteBatch、Snapshot使用

程序员文章站 2024-03-21 11:01:16
...

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,如下:

leveldb中WriteBatch、Snapshot使用

以下是一段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是否存在,以下是程序运行结果:

leveldb中WriteBatch、Snapshot使用

在第一次取的时候取的值为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读出之前的值,代码运行效果如下:

leveldb中WriteBatch、Snapshot使用

通过Snapshot取出的就是之前的被覆盖的旧值,其实也好理解,这里的Snapshot应该就是返回当前最新版本的一个切面数据,方便用来查看某一时的数据使用。

综上


其实只是讲用法的话,其实没有太多可以讲的,leveldb只是一个基础存储引擎,没有太多新奇的特性,只有最基础的API,因此翻来覆去基本就是这几个玩意,所以对用法就暂时讲到这,下一节从底层源码分析。