键值储存数据库(mapdb)

概述

MapDB是一个功能强大、易于使用的Java嵌入式数据库引擎。它提供了高性能、轻量级和易于扩展的特性,使得开发者可以轻松地构建高效、可靠的数据存储解决方案。

maven依赖

xml 复制代码
<!-- https://mvnrepository.com/artifact/org.mapdb/mapdb -->
<dependency>
    <groupId>org.mapdb</groupId>
    <artifactId>mapdb</artifactId>
    <version>3.1.0</version>
</dependency>
<dependency>
    <groupId>org.jetbrains.kotlin</groupId>
    <artifactId>kotlin-stdlib</artifactId>
    <version>[1.9.22,1.9.999)</version>
</dependency>

示例

  • 基础使用
java 复制代码
    @Test
    void contextLoads() {
        //创建内存数据库
        DB db = DBMaker.memoryDB().make();

        //创建HashMap数据结构的数据储存对象,类似于mysql的表
        HTreeMap<String, String> map = db.hashMap("map")
                .keySerializer(Serializer.STRING)
                .valueSerializer(Serializer.STRING)
                .createOrOpen();
        //数据的存取操作,类似于JDK中Map的操作
        map.put("name","你好");
        System.out.println(map.get("name"));

        //创建HashSet数据结构的数据储存对象
        HTreeMap.KeySet<String> set = db.hashSet("set")
                .serializer(Serializer.STRING)
                .createOrOpen();
        //数据的存取操作,类似于JDK中Set的操作
        set.add("A");

        //创建TreeMap数据结构的数据储存对象
        BTreeMap<String, String> treeMap = db.treeMap("treeMap")
                .keySerializer(Serializer.STRING)
                .valueSerializer(Serializer.STRING)
                .createOrOpen();
        //数据的存取操作
        treeMap.put("name","你好");
        System.out.println(treeMap.get("name"));

        //创建TreeSet数据结构的数据储存对象
        NavigableSet<String> treeSet = db.treeSet("treeSet")
                .serializer(Serializer.STRING)
                .createOrOpen();
        //数据的存取操作
        treeSet.add("A");

        //创建IndexTreeList数据结构的数据储存对象
        IndexTreeList<Object> treeList = db.indexTreeList("treeList")
                .createOrOpen();
        //数据的存取操作
        treeList.add("A");
        System.out.println(treeList.get(0));
        
        //关闭数据库
        db.close();
    }
  • 持久化存储
java 复制代码
   //创建文件数据库
    DB db = DBMaker.fileDB("D:\\develop\\cache.db").make();
  • 事务支持
java 复制代码
    @Test
    void contextLoads() {
        //创建内存数据库
        DB db = DBMaker.memoryDB().transactionEnable().make();
        //创建HashMap数据结构的数据储存对象,类似于mysql的表
        HTreeMap<String, String> map = db.hashMap("map")
                .keySerializer(Serializer.STRING)
                .valueSerializer(Serializer.STRING)
                .createOrOpen();
        //数据的存取操作,类似于JDK中Map的操作
        map.put("v1","A");
        map.put("v2","B");
        db.commit();
        map.put("v3","C");
        map.put("v4","D");
        db.rollback();
        map.put("v5","E");
        map.put("v6","F");
        //添加成功数据:[v5, v1, v6, v2],v3、v4未添加已回滚
        System.out.println(map.keySet());
        //关闭数据库
        db.close();
    }

常用API

数据库操作对象

  • DBMaker 工厂类,用于创建不同类型的数据库实例。
方法 说明
memoryDB() 创建内存数据库,数据被序列化后存储在 byte 数组中 默认模式,适用于大多数场景,比堆内模式更节省GC 开销
heapDB() 创建堆内数据库,数据直接存储在 Java 堆中,不使用序列化,适用于小数据集,缺点是受 GC 影响,数据量大会导致性能下降
memoryDirectDB() 使用Java NIO的DirectByteBuffer,数据存储在堆外内存 ,不受 GC 控制,适合大数据量场景 ,性能最好,但需要手动管理内存
fileDB(File file) fileDB(String file) 创建文件数据库,将数据保存到文件中。
tempFileDB() 创建临时文件数据库,数据在数据库关闭后会自动删除 。
heapShardedHashMap(Int concurrency) 用于构建‌分片机制的堆内储存对象(map数据结构),返回HashMapMaker对象
heapShardedHashSet(Int concurrency) 用于构建‌分片机制的堆内储存对象(set数据结构),返回HashSetMaker对象
memoryShardedHashMap(Int concurrency) 用于构建‌分片机制的内存储存对象(map数据结构),返回HashMapMaker对象
memoryShardedHashSet(Int concurrency) 用于构建‌分片机制的内存储存对象(set数据结构),返回HashSetMaker对象
volumeDB(Volume volume,Boolean volumeExists) 创建基于 Volume 存储的数据库
  • Maker DB对象创建对象
方法 说明
allocateIncrement(Long incrementSize) 每次批量分配自增值时的步长
allocateStartSize(Long size) 初始化内存池的起始大小
checksumHeaderBypass() 绕过数据库文件头校验和检查
checksumStoreEnable() 是否在存储数据时计算并保存校验和(如CRC32、MD5等),用于后续验证数据的完整性。
cleanerHackEnable() 是否启用直接调用底层清理接口绕过 JVM 限制,加速内存回收。
closeOnJvmShutdown() 在 JVM 关闭时自动释放数据库资源
closeOnJvmShutdownWeakReference() 在 JVM 关闭时利用弱引用的特性自动触发清理逻辑,同时减少因强引用导致的内存无法释放问题。
concurrencyDisable() 禁用 MapDB 内部的并发控制机制(如读写锁、分段锁等),使数据库操作变为单线程执行模式。
concurrencyScale(Int segmentCount) 控制 MapDB 内部并发结构(如哈希表分段锁、B树节点锁等)的并发访问能力,值越大表示支持更高的并发线程数。
executorEnable() 启用异步执行引擎
fileChannelEnable() 启用FileChannel模式,该模式通过Java NIO的FileChannel实现磁盘存储,性能介于普通文件存储和内存映射(Mmap)之间。
fileDeleteAfterClose() 在数据库关闭时自动删除磁盘文件。
fileDeleteAfterOpen() 在数据库开启时自动删除磁盘文件。
fileLockDisable() 禁用文件锁,适用于需要避免文件锁定冲突的场景。
fileLockWait() fileLockWait(Long timeout) 用于在尝试获取文件锁时设置一个最大等待时间
fileMmapEnable()
fileMmapEnableIfSupported()
fileMmapPreclearDisable() 禁用内存映射文件在使用前的预清零操作
fileSyncDisable() 禁用文件同步操作,将不会在每次写入后立即将数据同步到磁盘,提升数据库的写入性能,但有数据丢失风险。
readOnly() 启用只读模式,数据库实例仅允许读取操作,任何写入、删除或修改操作会抛出
transactionEnable() 开启数据库事务支持
make() 创建DB实例对象
  • DB 数据库对象
方法 说明
hashMap(String name ) hashMap(String name , keySerializer Serializer, valueSerializer Serializer) 用于创建hashMap数据结构的储存对象。
hashSet(String name ) hashSet(String name ,Serializer serializer ) 用于创建hashSet数据结构的储存对象。
treeMap(String name ) treeMap(String name ,GroupSerializer keySerializer,GroupSerializer valueSerializer) 用于创建treeMap数据结构的储存对象。
treeSet(String name ) treeSet(String name ,GroupSerializer serializer) 用于创建treeSet数据结构的储存对象。
indexTreeList(String name ) indexTreeList(String name ,Serializer serializer ) 用于创建indexTreeList数据结构的储存对象。
atomicBoolean(String name) atomicBoolean(String name ,Boolean value ) 线程安全的布尔类型原子操作
atomicInteger(String name ) atomicInteger(String name ,Int value ) 线程安全的整数原子操作
atomicLong(String name) atomicLong(String name ,Long value ) 线程安全的长整数原子操作
atomicString(String name ) atomicString(String name , String value) 线程安全的字符串原子操作
atomicVar(String name ) atomicVar(String name ,Serializer serializer ) atomicVar(String name ,Serializer serializer ,E value) 线程安全的序列化对象原子操作
commit() 数据库提交数据
rollback() 数据库回滚数据
close() 关闭数据库
getClassLoader() 获取类加载器
getDefaultSerializer() 获取默认序列化器
isThreadSafe() 判断线程是否安全
getShutdownHook() 用于获取数据库实例关联的关闭钩子,能够在JVM关闭时自动执行数据库的关闭操作,确保数据完整性和资源正确释放
checkThreadSafe() 通过内置的同步控制机制来保证多线程环境下的数据一致性
defaultSerializerRegisterClass(Class clazz) 用于向序列化器注册表注册指定类的默认序列化器
exists(String name) 用于检查指定名称的资源是否存在
get(String name)
getAll()
getAllNames()
getNameForObject(Any e )
getStore()
isClosed()
nameCatalogGetClass(SortedMap<String, String> nameCatalog,String key )
nameCatalogLoad()
nameCatalogParamsFor(String name )
nameCatalogPutClass(SortedMap<String, String> nameCatalog,String key ,Any obj )
nameCatalogSave(SortedMap<String, String> nameCatalog)
nameCatalogVerifyGetMessages()

数据储存结构对象创建对象

  • HashMapMaker
方法 说明
create() 创建新的集合。 如果集合存在,将扔出异常。
open() 打开存在的集合。 如果集合不存在,将扔出异常。
createOrOpen() 如果存在就打开, 否则创建。
counterEnable() 启用大小计数器,启用后 map.size()是实时的,但是在插入时会有一些开销。
expireAfterCreate() expireAfterCreate(Long ttl) expireAfterCreate(Long ttl,TimeUnit unit ) 基于创建时间设置过期时间
expireAfterGet() expireAfterGet(Long ttl) expireAfterGet(Long ttl,TimeUnit unit ) 基于最后访问时间设置过期时间
expireAfterUpdate() expireAfterUpdate(ttl Long) expireAfterUpdate(ttl Long,TimeUnit unit ) 基于最后更新时间设置过期时间
expireCompactThreshold(Double freeFraction ) 配置启动压缩的 剩余空间阈值,例如配置0.4则剩余空间不足40%时启动数据压缩
expireExecutor(ScheduledExecutorService executor) 配置过期处理线程池
expireExecutorPeriod(Long period ) 设置过期检测时间周期
expireMaxSize(Long maxSize ) 设置 数据储存集合大小
expireStoreSize(Long storeSize ) 设置储存数据的大小
expireOverflow(MutableMap<K, V> overflowMap) 配置数据溢出时的数据保存对象
hashSeed(int hashSeed ) 指定哈希种子
keySerializer(Serializer keySerializer ) 设置键 序列化器
valueSerializer(Serializer valueSerializer) 设置值 序列化器
layout(int concurrency,int dirSize,int levels) 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数)
modificationListener(MapModificationListener<K, V> listener) 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数)
removeCollapsesIndexTreeDisable()
valueInline()
valueLoader(Function1 valueLoader) 设置键为空时的默认值
  • HashSetMaker
方法 说明
create() 创建新的集合。 如果集合存在,将扔出异常。
open() 打开存在的集合。 如果集合不存在,将扔出异常。
createOrOpen() 如果存在就打开, 否则创建。
counterEnable() 启用大小计数器,启用后 map.size()是实时的,但是在插入时会有一些开销。
expireAfterCreate() expireAfterCreate(Long ttl) expireAfterCreate(Long ttl,TimeUnit unit) 基于创建时间设置过期时间
expireAfterGet() expireAfterGet(Long ttl) expireAfterGet(Long ttl,TimeUnit unit) 基于最后访问时间设置过期时间
expireCompactThreshold(Double freeFraction) 配置启动压缩的 剩余空间阈值,例如配置0.4则剩余空间不足40%时启动数据压缩
expireExecutor(ScheduledExecutorService executor) 配置过期处理线程池
expireExecutorPeriod(Long period) 设置过期检测时间周期
expireMaxSize(Long maxSize) 设置 数据储存集合大小
expireStoreSize(Long storeSize) 设置储存数据的大小
hashSeed(int hashSeed) 指定哈希种子
layout(int concurrency,int dirSize,int levels) 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数)
removeCollapsesIndexTreeDisable()
serializer(Serializer serializer)
  • IndexTreeListMaker
方法 说明
create() 创建新的集合。 如果集合存在,将扔出异常。
open() 打开存在的集合。 如果集合不存在,将扔出异常。
createOrOpen() 如果存在就打开, 否则创建。
layout(int dirSize,int levels) 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数)
removeCollapsesIndexTreeDisable()
  • IndexTreeLongLongMapMaker
方法 说明
create() 创建新的集合。 如果集合存在,将扔出异常。
open() 打开存在的集合。 如果集合不存在,将扔出异常。
createOrOpen() 如果存在就打开, 否则创建。
layout(int dirSize,int levels) 设置底层数据结构布局。concurrency(线程数)、nodeSize(节点大小)、levels(层级数)
removeCollapsesIndexTreeDisable()
  • TreeMapMaker
方法 说明
create() 创建新的集合。 如果集合存在,将扔出异常。
open() 打开存在的集合。 如果集合不存在,将扔出异常。
createOrOpen() 如果存在就打开, 否则创建。
counterEnable() 启用大小计数器,启用后 map.size()是实时的,但是在插入时会有一些开销。
createFrom(Iterator<kotlin.Pair<K, V>> iterator)
createFromSink()
keySerializer(GroupSerializer keySerializer)
maxNodeSize(int size)
modificationListener(MapModificationListener<K, V> listener)
valueSerializer(GroupSerializer valueSerializer)
valuesOutsideNodesEnable()
  • TreeSetMaker
方法 说明
create() 创建新的集合。 如果集合存在,将扔出异常。
open() 打开存在的集合。 如果集合不存在,将扔出异常。
createOrOpen() 如果存在就打开, 否则创建。
counterEnable() 启用大小计数器,启用后 map.size()是实时的,但是在插入时会有一些开销。
maxNodeSize(int size) 配置最大节点数量
serializer(GroupSerializer serializer) 数组序列化器

线程安全的变量创建对象

说明
AtomicStringMaker 用于实现线程安全的字符串操作
AtomicLongMaker 用于实现线程安全的Long类型操作
AtomicIntegerMaker 用于实现线程安全的Intger类型操作
AtomicBooleanMaker 用于实现线程安全的布尔类型操作
AtomicVarMaker 用于实现线程安全的指定类型对象操作

Serializer 序列化器

  • 可用的序列化实现类(Serializer接口常量)
常量 说明
CHAR 字符(Character)序列化
STRING_ORIGHASH 字符串(String)序列化,使用弱哈希String.hashCode()。通过保留原始哈希值来提高性能。
STRING 字符串(String)序列化,使用强哈希算法,能够处理各种字符串数据。
STRING_DELTA 字符串(String)序列化,基于差分编码,仅存储字符串与前一个值的差异部分,适合存储相似字符串
STRING_DELTA2 字符串(String)序列化,支持更复杂的差分策略,兼容性更强,适用于更广泛的字符串模式。
STRING_INTERN 字符串(String)序列化,使用字符串池优化,通过复用相同字符串实例减少内存占用。
STRING_ASCII 字符串(String)序列化,使用ASCII字符优化,用于处理ASCII编码的字符串数据。
STRING_NOSIZE 字符串(String)序列化,使用字符串数据优化,不存储字符串长度信息,减少序列化开销,适合固定长度或已知长度的字符串。
LONG 长整型(Long)序列化,直接存储长整型值,无压缩或增量计算。适用于需要直接访问原始值的简单场景,如唯一ID或计数器。
LONG_PACKED 长整型(Long)序列化,将多个长整型值打包存储,减少内存占用。适用于存储大量连续长整型数据(如时间戳序列),通过位压缩优化空间效率。
LONG_DELTA 长整型(Long)序列化,存储长整型值的增量(差值),而非绝对值。数据具有单调递增或可预测变化趋势(如传感器读数),可显著减少存储空间。
INTEGER 整数(int)序列化, 直接将int类型转换为4字节的二进制流存储。适用于数据分布均匀或无规律时的通用场景。
INTEGER_PACKED 整数(int)序列化, 通过变长编码(类似UTF-8)压缩整数,小数值占用更少字节(1-5字节),大数值占用5字节。适用于数据中包含大量小整数时(如ID、状态码)。
INTEGER_DELTA 整数(int)序列化, 存储整数与前一个值的差值(Δ),适用于有序或连续递增的数据(如时间戳)。
BOOLEAN 布尔类型(boolean)序列化
RECID 长整型(Long)序列化,用于唯一标识单条存储记录
RECID_ARRAY 长整型数组(Long[])序列化,用于管理多个RECID的数组类型,适用于批量存储或关联记录的场景。
ILLEGAL_ACCESS 对象(Object)序列化, 序列化与反序列化直接抛异常,用于权限控制。
BYTE_ARRAY 字节数组(byte[])序列化,标准字节数组存储,基准性能,无特殊优化,适用于通用二进制数据
BYTE_ARRAY_DELTA 字节数组(byte[])序列化,使用增量编码(差分存储),适用于重复内容较多的二进制数据(如日志)
BYTE_ARRAY_DELTA2 字节数组(byte[])序列化,优化版增量编码(支持快速查找),适用于高频更新的二进制数据(如实时监控)
BYTE_ARRAY_NOSIZE 字节数组(byte[])序列化,无长度前缀(通过流确定大小),适用于大文件存储(如视频、PDF)
CHAR_ARRAY 字符数组(char[])序列化
INT_ARRAY 整数数组(int[])序列化
LONG_ARRAY 长整型数组(long[])序列化
DOUBLE_ARRAY 双精度浮点数数组(double[])序列化
JAVA 对象(Object)序列化,基于Java(ObjectOutputStream 和 ObjectInputStream)原生序列化机制实现,支持所有实现了 Serializable 接口的对象
ELSA 高效字符串序列化,适用于高频字符串存储(如日志、消息队列)、多语言文本处理(支持完整 Unicode)、需要快速随机访问的场景(通过索引直接定位)
UUID 随机字符串(UUID)序列化
BYTE 字节(byte)序列化
FLOAT 浮点数(float)序列化
DOUBLE 双精度浮点数(double)序列化
SHORT 短整型(short)序列化
SHORT_ARRAY 短整型数组(short[])序列化
FLOAT_ARRAY 浮点数数组(float[])序列化
BIG_INTEGER 大整数(BigInteger)序列化
BIG_DECIMAL 大数(BigDecimal)序列化
CLASS 类(Class) 序列化
DATE 日期(Date) 序列化

可参考文档

相关推荐
c***69301 小时前
超详细:数据库的基本架构
数据库·架构
Sunhen_Qiletian1 小时前
《Python开发之语言基础》第六集:操作文件
前端·数据库·python
whn19771 小时前
达梦DW数据库安装
数据库
SelectDB1 小时前
宇信科技基于 SelectDB & Apache Doris 构建实时智能的银行经营分析平台
数据库·apache
胖咕噜的稞达鸭2 小时前
算法入门:滑动窗口--->找到字符串中所有的字母异位词,串联所有的子串,最小覆盖子串
数据库·redis·算法
SelectDB2 小时前
上海证券 SelectDB 升级实践:湖仓流批一体落地与 Elasticsearch 全面替换
数据库·apache
一个天蝎座 白勺 程序猿2 小时前
KingbaseES在政务领域的应用实践——武汉人社大数据平台“数字化服务新模式”
大数据·数据库·政务·kingbasees·金仓数据库
f***01933 小时前
【MySQL】JDBC的连接
数据库·mysql
5***T4483 小时前
开启mysql的binlog日志
数据库·mysql