zoukankan      html  css  js  c++  java
  • mapDB的基本用法

    第一步加依赖:

    <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();
        }
    
    }
  • 相关阅读:
    python种的builtin函数详解第三篇 C
    python中的buildin函数详解(第一篇) C
    python中的formatter的详细用法 C
    python中的builtin函数详解第二篇 C
    python中函数的默认参数陷阱问题 C
    介绍C++11标准的变长参数模板
    猜数字
    父类和子类
    矩形的面积
    水果类
  • 原文地址:https://www.cnblogs.com/maohuidong/p/15571354.html
Copyright © 2011-2022 走看看