• 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();
        }
    
    }
  • 相关阅读:
    打造分布式爬虫
    vue入门-常用指令操作
    爬虫练习-爬取小说
    爬虫项目-爬取亚马逊商品信息
    爬虫框架_scrapy1
    CIE-LUV是什么颜色特征
    多目标跟踪baseline methods
    时间序列识别代码调试版本1
    拓扑空间1
    ps cs6破解
  • 原文地址:https://www.cnblogs.com/maohuidong/p/15571354.html
Copyright © 2020-2023  润新知