leveldb的使用
java有时候需要处理很多key,value的数据。电商行业最常见的就是商品ID,值。
java本地对象储存一种方便的方案。
对于几百万、几千万可以用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/xx_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(),不用这行,你在控制台可以看到内存一直在增长。用上这行,你看内存就不会一直长了。这证明内存是可控的。
相关阅读
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑