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();
        }
    
    }
  • 相关阅读:
    Entity Framework Core 2.0 新特性
    asp.net core部署时自定义监听端口,提高部署的灵活性
    asp.net core使用jexus部署在linux无法正确 获取远程ip的解决办法
    使用xshell连接服务器,数字键盘无法使用解决办法
    使用Jexus 5.8.2在Centos下部署运行Asp.net core
    【DevOps】DevOps成功的八大炫酷工具
    【Network】Calico, Flannel, Weave and Docker Overlay Network 各种网络模型之间的区别
    【Network】UDP 大包怎么发? MTU怎么设置?
    【Network】高性能 UDP 应该怎么做?
    【Network】golang 容器项目 flannel/UDP相关资料
  • 原文地址:https://www.cnblogs.com/maohuidong/p/15571354.html
Copyright © 2011-2022 走看看