1. 程式人生 > >leveldb入門

leveldb入門

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原始碼上的分析。