第一步加依赖:

<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();
    }

}

 

posted on 2021-11-18 11:06  毛会懂  阅读(1230)  评论(0编辑  收藏  举报