第一步加依赖:
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>3.0.7</version>
</dependency>
第二步:
package com.rongyi.platform.game.web.websocket; import org.mapdb.DB; import org.mapdb.DBMaker; import org.mapdb.HTreeMap; import org.mapdb.Serializer; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class MapDB { /** * @desc : mapDB的基本用法, 一般不这样用,因为可以直接用jvm的堆内存(如hashMap,ConcurrentMap等)。 * @author : 毛会懂 * @create: 2021/11/18 11:01:00 **/ public static void main(String[] args) { DB db = DBMaker.memoryDB().make(); // 基于堆内存, 进程结束后,数据消失。 ConcurrentMap map = db.hashMap("map").create(); // 创建map名称为map的结构。 map.put("key","value"); System.out.println("获取值:" + map.get("key")); db.close(); } /** mapDB写数据到磁盘 * @desc : 描述 * @author : 毛会懂 * @create: 2021/11/18 11:00:00 **/ public static void main2(String[] args) { DB db = DBMaker.fileDB("file1.db") // 基于磁盘存储,进程结束后,数据不丢失。 .checksumHeaderBypass() // 文件损坏(比如没有db.close()有可能造成文件损坏), 则修复。 .allocateStartSize(10*1024*1024) // 初始化文件的大小,为10M .allocateIncrement(1024*1024).make(); // 文件递增的大小为1M // 在db中创建或打开name为map的map结构。name的名字是自己定义的。 ConcurrentMap<String,String> map = db.hashMap("map", Serializer.STRING,Serializer.STRING).createOrOpen(); for(Long i = 0L;i < Integer.MAX_VALUE;i++){ map.put(i.toString(),"大家好" + i); System.out.println(i); } db.close(); // 好习惯是进程结束的时候一定要db.close() } /** * @desc : mapDB直接从磁盘中读数据 * @author : 毛会懂 * @create: 2021/11/18 11:00:00 **/ public static void main3(String[] args) { DB db = DBMaker.fileDB("file1.db") .checksumHeaderBypass() .allocateStartSize(10*1024*1024) .allocateIncrement(1024*1024).make(); ConcurrentMap<String,String> map = db.hashMap("map", Serializer.STRING,Serializer.STRING).createOrOpen(); System.out.println(map.get("1350354")); // 从main2写入的数据,可以从这个进程中读取出来。因为是写到磁盘的。 db.close(); } /** mapDB 基于磁盘的 hashMap和hashSet的用法 * @desc : 描述 * @author : 毛会懂 * @create: 2021/11/18 10:59:00 **/ public static void main4(String[] args) { DB db = DBMaker.fileDB("file3.db").make(); ConcurrentMap<String, Long> map = db.hashMap("map1", Serializer.STRING, Serializer.LONG).create(); HTreeMap.KeySet<String> set = db.hashSet("set1", Serializer.STRING).create(); map.put("something",123L); set.add("123"); set.add("456"); System.out.println(map.get("something")); System.out.println(set.getMap().keySet()); } /** mapDB的事务操作 * @desc : 描述 * @author : 毛会懂 * @create: 2021/11/18 10:59:00 **/ public static void main5(String[] args) { DB db = DBMaker.fileDB("file4.db") .fileMmapEnable() // 打开文件与内存的映射,适用于64的机器,32的机器有可能有问题 .transactionEnable() // dbMap支持事务。 .closeOnJvmShutdown() .make(); HTreeMap<String, Long> map = db.hashMap("mapsl3", Serializer.STRING, Serializer.LONG).createOrOpen(); map.put("a",1L); map.put("b",2L); db.commit(); // 提交事务 System.out.println(map.get("a")); System.out.println(map.get("b")); map.put("c",3L); System.out.println(map.get("c")); db.rollback(); // 回滚事务 System.out.println(map.get("c")); // 回滚后数据不再存在 System.out.println(map.get("a")); db.close(); } /** mapDB,支持内存和磁盘同步数据 * 注意: 在内存的数据get后,如果到了过期时间,不是立即同步到磁盘的,具体同步到磁盘的时间不确定 * 所以有时候直接从磁盘读是读不到数据的。 * 正确的用法是:每次都要从内存读。 * @desc : 描述 * @author : 毛会懂 * @create: 2021/11/18 10:54:00 **/ public static void main6(String[] args) throws InterruptedException { DB dbDisk = DBMaker.fileDB("file48").checksumHeaderBypass().make(); DB dbMemory = DBMaker.memoryDB().checksumHeaderBypass().make(); HTreeMap onDisk = dbDisk.hashMap("onDisk").createOrOpen(); HTreeMap inMemory = dbMemory.hashMap("inMemory") .expireAfterGet(1, TimeUnit.SECONDS) // get后,多久失效 .expireOverflow(onDisk) // 失效后同步到磁盘,但同步的时间不确定 .expireExecutor(Executors.newScheduledThreadPool(2)) // 没太懂这个配置 .create(); // inMemory.put("name4","43"); // System.out.println("从内存中获取" + inMemory.get("name4")); // Thread.sleep(5000); //// System.out.println("从内存中获取" + inMemory.get("name4")); //// Thread.sleep(5000); // //System.out.println(onDisk.size()); // System.out.println("从磁盘中获取" + onDisk.get("name4")); // System.out.println(onDisk.size()); // System.out.println(inMemory.size()); // System.out.println("----------"); // inMemory.put(1,"one"); // System.out.println(inMemory.size()); // System.out.println(onDisk.size()); // System.out.println(inMemory.get(1)); // System.out.println(onDisk.get(1)); // // System.out.println("----------"); // Thread.sleep(5000); // System.out.println(inMemory.size()); // System.out.println(onDisk.size()); // System.out.println(inMemory.get(1)); // System.out.println(onDisk.get(1)); // inMemory.put("name","zfx"); // System.out.println("从内存中获取" + inMemory.get("name")); // inMemory.remove("name"); // Thread.sleep(5000); // System.out.println(onDisk.size()); // System.out.println(onDisk.get("name")); inMemory.put(1,11); inMemory.put(2,12); inMemory.clearWithExpire(); // 执行这步操作,会触发同步到磁盘。 System.out.println(inMemory.get(1)); System.out.println(inMemory.get(2)); Thread.sleep(5000); System.out.println(inMemory.get(1)); System.out.println(inMemory.get(2)); System.out.println(onDisk.size()); System.out.println(onDisk.get(1)); System.out.println(onDisk.get(2)); System.out.println("----"); System.out.println(inMemory.size()); System.out.println(inMemory.get(1)); System.out.println(inMemory.size()); dbDisk.close(); inMemory.close(); } }