leveldb中WriteBatchSnapshot使用

Posted 叶长风

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leveldb中WriteBatchSnapshot使用相关的知识,希望对你有一定的参考价值。

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,因此翻来覆去基本就是这几个玩意,所以对用法就暂时讲到这,下一节从底层源码分析。

以上是关于leveldb中WriteBatchSnapshot使用的主要内容,如果未能解决你的问题,请参考以下文章

未加载库:@rpath/leveldb.framework/leveldb

LevelDB 在删除 LevelDB 实例时断言

leveldb中WriteBatchSnapshot使用

leveldb无法在wsl1中使用

03-Leveldb原理

03-Leveldb原理