leveldb的使用

java有时候需要处理很多key,value的数据。电商行业最常见的就是商品ID,值。

对于几百万、几千万可以用leveldb来存储,快不快没有细测。但其可用性是得到验证的。

下面是一个测试的例子。

首先还是下载Java包,用maven:

<dependencies>
	<dependency>
		<groupId>org.iq80.leveldb</groupId>
		<artifactId>leveldb-api</artifactId>
		<version>0.10</version>
	</dependency>
	<dependency>
		<groupId>org.iq80.leveldb</groupId>
		<artifactId>leveldb</artifactId>
		<version>0.10</version>
	</dependency>
</dependencies>
然后写一段Java测试代码:

package net.highersoft.leveldb;

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

import org.iq80.leveldb.DB;
import org.iq80.leveldb.DBFactory;
import org.iq80.leveldb.DBIterator;
import org.iq80.leveldb.Options;
import org.iq80.leveldb.impl.Iq80DBFactory;

public class Test {

	public static void main(String[] args) throws IOException {
		//初始化DB
		String folder="/Users/chengzhong/work/dhgate_work/dev_file/leveldb";
		DBFactory factory = new Iq80DBFactory();
		Options options = new Options();
		options.createIfMissing(true);
		//folder 是db存储目录
		DB db = factory.open(new File(folder), options);
		//存储Key Value 值
		//levelDB 的api存储都是字节数组  所以这里需要转成字节数组
		String key="key";
		String value="value";
		for(int i=0;i<1000000;i++) {
			db.put(Iq80DBFactory.bytes(key+i), Iq80DBFactory.bytes(value+i));
			
			if(i%10000==0) {
				System.out.println("use memory:"+(Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/1024/1024+"MB");
				System.gc();
			}
		}
		//获取Value
		byte[] bytes = db.get(Iq80DBFactory.bytes(key));
		value = Iq80DBFactory.asString(bytes);
		System.out.println("value:"+value);
		System.out.println("key1111:"+new String(db.get(Iq80DBFactory.bytes("key1111"))));

		//删除
		//db.delete(Iq80DBFactory.bytes(key));
		//更改 重新put新的key - value即可
		//db.put(Iq80DBFactory.bytes(key), Iq80DBFactory.bytes(value+"update"));
		
		System.out.println(Integer.toHexString(255));

	}
	public LinkedHashMap<String, String> iteratorDb(DB db) {
	    DBIterator iterator = db.iterator();
	    LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
	    while (iterator.hasNext()) {
	        Map.Entry<byte[], byte[]> next = iterator.next();
	        String key = Iq80DBFactory.asString(next.getKey());
	        String value = Iq80DBFactory.asString(next.getValue());
	        linkedHashMap.put(key, value);
	    }
	    return linkedHashMap;
	}

}


这里有意思的是第33行的System.gc(),不用这行,你在控制台可以看到内存一直在增长。用上这行,你看内存就不会一直长了。这证明内存是可控的。


文/程忠 浏览次数:0次   2020-10-13 19:25:43

相关阅读


评论: