网站首页 > 博客文章 正文
数据缓存和存储对于性能敏感的应用程序而言十分重要。我们已经拥有了各式各样的缓存方式,然而,它们也各有各的缺点,GC 问题、网络瓶颈问题、事务支持、可扩展性问题等等。如何为 Java 的 collections 提供一个高级的、易用的、轻便的,同时拥有足够高的性能、足够小的额外开销、足够低的管理成本,这是一个不小的议题。MapDB,就提供了一个不错的解决方案。
简介
MapDB,是 jankotek 在 Github 上开源的嵌入式 Java 数据库引擎,仓库位于 https://github.com/jankotek/mapdb,目前版本为 3.0.8。
MapDB 提供了基于磁盘或者堆外存储的并发的 Maps、Sets、Lists、Queues 等实现,组合了嵌入式数据库引擎和 Java collections。MapDB 能够被用于多种场景:
- 提供针对于 Maps, Lists, Queues 和其他 collections 的直接替代
- 提供不收 GC 垃圾回收影响的堆外数据结构存储
- 提供多层级的缓存,带有过期机制和溢出硬盘落地
- 提供 RDBMs 替代,带有事务、MVCC、增量备份等
- 提供本地数据处理和筛选,能够在有限的时间内处理巨量数据
使用
要在项目中使用 MapDB,首先通过 Maven 添加依赖:
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>VERSION</version>
</dependency>
每日最新版本则在 snapshot 仓库中:
<repositories>
<repository>
<id>sonatype-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.mapdb</groupId>
<artifactId>mapdb</artifactId>
<version>VERSION</version>
</dependency>
</dependencies>
也可以从 Maven Central 下载 MapDB 的 jar 文件使用。
我们来看一个简单的使用例子:
//import org.mapdb.*
DB db = DBMaker.memoryDB().make();
ConcurrentMap map = db.hashMap("map").createOrOpen();
map.put("something", "here");
在该例子中,我们开启了一个内存中的 HashMap,并使用堆外存储,免受 GC 影响。我们也可以把这个 HashMap 存储到文件中,来在 JVM 重启之间保持数据:
DB db = DBMaker.fileDB("file.db").make();
ConcurrentMap map = db.hashMap("map").createOrOpen();
map.put("something", "here");
db.close();
这里添加了 db.close() 来确保文件免受数据损坏。
默认情况下,MapDB 使用通用的数据序列化方式来保证泛用性。我们可以使用特定的序列化方式来提供更快的速度和更高效的内存使用。我们还可以在64位系统中启用更为高效的基于内存映射的文件:
DB db = DBMaker
.fileDB("file.db")
.fileMmapEnable()
.make();
ConcurrentMap<String,Long> map = db
.hashMap("map", Serializer.STRING, Serializer.LONG)
.createOrOpen();
map.put("something", 111L);
db.close();
MapDB 是可插拔的,其提供了两个类:DB 和 DBMaker 来粘合不同的插件。
DBMaker 类负责处理数据库配置、创建和连接,MapDB 提供了数种不同配置模式。
DB 类实例代表了一个已连接的数据库,或一个数据库事务会话。其能够被用来创建和开启数据结构存储,并能够处理如 commit()、rollback() 和 close() 等数据库生命周期方法。
ConcurrentNavigableMap<Integer,String> map = db
.treeMap("collectionName", Serializer.INTEGER, Serializer.STRING)
.createOrOpen();
map.put(1,"one");
map.put(2,"two");
//map.keySet() is now [1,2] even before commit
db.commit(); //persist changes into disk
map.put(3,"three");
//map.keySet() is now [1,2,3]
db.rollback(); //revert recent changes
//map.keySet() is now [1,2]
db.close();
MapDB 提供了数种重要的数据结构实现:
- HTreeMap:提供了 HashMap 和 HashSet 在 MapDB 中的实现,线程安全且支持过期机制
- BTreeMap:提供了 TreeMap 和 TreeSet 在 MapDB 中的实现,基于无锁的并发 B-链树
- SortedTableMap:把键值存储在固定大小的表中,并使用二分查找查询
总结
MapDB 是一个轻量级的本地缓存的框架,既可以使用堆外存储,也可以使用磁盘存储。其提供了大量的优化,能够直接替代原生的 Map、Set 等数据结构,提供不受 GC 影响,多级缓存,乃至于带有事务的 RDBMs 存储,提供了优秀的数据结构存储替代。
- 上一篇: 超好用的UnixLinux 命令技巧 大神为你详细解读
- 下一篇: MapDB
猜你喜欢
- 2024-11-21 JDK 16 即将发布,看完这些新特性,我感觉已经学不动了
- 2024-11-21 面试官:说说缓存最关心的问题?有哪些类型?回收策略和算法?
- 2024-11-21 对比着学 Go 语言-基础:类型之 map
- 2024-11-21 分享一道大厂面试题:有没有比读写锁更快的锁?
- 2024-11-21 高性能缓存设计
- 2024-11-21 美团面试官:有没有比读写锁更快的锁?
- 2024-11-21 恕我直言,牛逼哄哄的MongoDB你可能只会30%
- 2024-11-21 缓存核心知识小抄,面试必备,赶紧收藏
- 2024-11-21 高性能Java缓存体系工具框架介绍
- 2024-11-21 基础知识:旋转机械中的阶次分析
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)