Hazelcast与MongoDB集成

Hazelcast与MongoDB集成

作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs

一、Hazelcast与MongoDB

Hazelcast的分布式数据结构和计算性能使得它可以作为应用程序后端的“MongoDB”。

MongoDB是一个开源的、面向文档的数据库,其扩展性和灵活性都非常好。MongoDB不是把数据存入(关系数据库的)表和行,而类似于JSON文档的方式和是以动态模式进行存储。简而言之,MongoDB是一种NoSQL数据存储,主要涉及数据的存储和持久化以及无模式数据的检索。

Hazelcast是一个开源的、分布式的、高可用的、可扩展的内存数据网格存储,它基于Apache v2许可证发布,可用作缓存、消息代理器以及分布式计算平台。Hazelcast强调高速访问分布式数据(通常是分布式的缓存)、分布式计算和分布式消息。

可以查看这个文档: https://hazelcast.com/use-cases/nosql/nosql-data-store/

Hazelcast可以当作NoSQL存储方案。MongoDB有一些数据网格、网格计算的功能,但MongoDB在这方面未做最优化。因此,Hazelcast和MongoDB在这方面做功能对比,有点类似于比较苹果和桔子。

Hazelcast和MongoDB可以结合起来协同工作,而不是相互竞争。Hazelcast支持使用MongoDB作为其后端的数据存储。把Hazelcast的数据映射到MongoDB是很容易的,无论是数据直接写还是延后写都支持。

下面我们回顾一下Hazelcast和MongoDB的特性,看看他们怎样相互配合工作。

二、特征

1、简单性

Hazelcast和MongoDB这两种技术运行都很简单,我们可以让MongoDB在几分钟内实现完全启动。比如,在Mac OS X系统上,可以使用brew安装MongoDB。

brew mongo install

Hazelcast的启动同样简单。

2、对Java开发者的优势

Hazelcast和MongoDB对于开发Java应用程序来说,是非常适合的。对于Hazelcast来说,可以在集群中直接使用Java对象,无需担忧数据传输层的问题,这样开发工作就简化了很多。而使用MongoDB就既需要使用MongoDB的数据结构,又需要写和配置数据传输层。

BSON库完全支持BSON数据格式、数据存储格式和网络传输层格式,MongoDB使用BSON作为存储的“文档”。BSON是二进制JSON的简称,是JSON数据序列化的二进制编码。

MongoDB官网上有Java驱动包,而且此驱动包是一个Java对象文档映射框架,可以把MongoDB的文档与Java对象进行双向映射。

就部署和集成Java应用而言,Hazelcast可以给应用带来低延迟的数据访问特性(通过各种机制),尤其是Hazelcast客户端的就近缓存和Hazelcast成员的嵌入式部署。而对于MongodB,网络延迟是存在的,因为它没有本地内存缓存。

3、分布式计算

Hazelcast的分布式计算框架极其强大,它允许任意业务逻辑执行位置引用,并支持跨集群的分布式扩展。MongoDB支持单线程的MapReduce框架,但不支持任意的用户代码执行。

Hazelcast在分布式计算方面还有很多MongoDB不具备的功能特性,比如分布式并发工具:锁、信号量、队列等,可以把任务协调分布到多个节点并行工作,而这些在本地是很难实现的。我知道很多人使用MongoDB作为他们自己的消息代理器的实现,但是很难想象,仅使用MongoDB如何实现实际的并行。

4、持久化

Hazelcast主要是解决访问分布式数据和进行分布式计算时保持低延迟。默认情况下,Hazelcast不涉及磁盘或其它持久化的存储。Hazelcast不是数据库。而MongoDB是一个真正的持久化数据库(当然,MongoDB的持久化也有一点问题,因为它的写操作是写内存,不是同步写入磁盘的。)

我们来看看把Hazelcast的数据持久化到MongoDB所带来的好处吧:

1)IMap和MapStore

Hazelcast的通读/通写功能是两个接口:MapLoader和MapStore。如果只需从数据库读取数据,那么开发者只需实现MapLoader接口。

MapLoader接口

public interface MapLoader<K, V> {
    V load(K key); (1)
    Map<K, V> loadAll(Collection<K> keys); (2)
    Iterable<K> loadAllKeys(); (3)
}
  • 1)方法一是获取给定键名的值。如果分布式的Map中未包含给定键名的值,那么Hazelcast将调用load(key)方法的实现来获取这个值。
  • 2)方法二是获取键名集合对应的所有键值。这是一个批读取操作,是针对多个读取给定键名的值的优化。
  • 3)方法三是获取存储区的所有键名。

MapStore接口继承了MapLoader接口,并允许保存IMap条目到数据库。

MapStore接口

public interface MapStore<K, V> extends MapLoader<K, V> {
    void store(K key, V value); (1)
    void storeAll(Map<K, V> map); (2)
    void delete(K key); (3)
    void deleteAll(Collection<K> keys); (4)
}
  • 1)存储键值对
  • 2)存储多个条目。此方法的实现可以优化多个存储键值对的操作
  • 3)删除给定键名的条目
  • 4)删除给定键名集合的多个条目

要想对MapLoader和MapStore接口了解的更多,查看文档: http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html#map-persistence

要与MongoDB互动,使用mongo-java-driver驱动包。

Maven依赖配置如下:

<dependency>
   <groupId>org.mongodb</groupId>
   <artifactId>mongo-java-driver</artifactId>
   <version>${mongo-java-driver.version}</version>
</dependency>

MongoClient mongoClient = new MongoClient(new MongoClientURI(mongoUrl)); (1)
MongoCollection collection = mongoClient.getDatabase(dbName).getCollection(collectionName); (2)
final Document document = (Document) collection.find(eq("_id", key)).first(); (3)
collection.insertOne(document); (3)
  • 1)使用给定URI(比如mongodb://localhost:27017)建立到MongoDB实例的连接
  • 2)MongoClient类提供了连接MongoDB实例、访问数据库、访问集合、访问文档的方法
  • 3)MongoCollection类允许对集合中的文档进行增删改查

总结

MongoDB结合Hazelcast,可以提供低延迟访问分布式、无模式的数据的解决方案。如果你在寻求NoSQL数据存储解决方案,MongoDB是很适合的。Hazelcast的fenbushii数据结构和分布式计算能力,是MongoDB所不具备的。

时间: 2024-09-30 11:13:28

Hazelcast与MongoDB集成的相关文章

mongodb集成spring

1:首先需要下载mongodb的java驱动包 https://github.com/mongodb/mongo-java-driver/downloads 2:需要下载spring集成mongodb的包 下载途径: a:去csdn下 b:去http://projects.spring.io/spring-data-mongodb/ 使用Maven方式下载 c:网上其他地方找 要下载的包如下 spring-data-commons-core-1.2.0.M2.jar spring-data-mo

ABP 结合 MongoDB 集成依赖注入

1.我们再ABP项目添加一个.NET Core类库  类库名自定定义, 我这里定义为 TexHong_EMWX.MongoDb 添加NuGet包. ABP mongocsharpdriver 添加 AbpMongoDbConfigurationExtensions.cs /// <summary> /// 定义扩展方法 <see cref="IModuleConfigurations"/> 允许配置ABP MongoDB模块 /// </summary&g

MongoDB学习笔记~为IMongoDBRepository接口添加分页取集合的方法

对于数据分页,我们已经见的太多了,几乎每个列表页面都要用到分页,这已经成了一种定理了,在进行大数据展示时,如果不去分页,而直接把数据加载到内存,这简直是不可以去相向的,呵呵,在很多ORM工具中都对分页有了更好的支持,如LINQ里有大家熟悉的take和skip,而在MongoDB里也有这种概念,它使用limit和skip实现,这在大多数的Mongo客户端上都集成了这个功能,即帮助我们组合命令参数,并带我们把分页取数据的指令发到Mongo服务器去,实现分页技术! 添加了分页后的IMongoDBRep

MongoDB资料汇总(转)

原文:MongoDB资料汇总 上一篇Redis资料汇总专题很受大家欢迎,这里将MongoDB的系列资料也进行了简单整理.希望能对大家有用. 最后更新时间:2013-04-22 1.MongoDB是什么 MongoDB介绍PPT分享 MongoDB GridFS介绍PPT两则 初识 MongoDB GridFS MongoDB GridFS 介绍 一个NoSQL与MongoDB的介绍PPT MongoDB:下一代MySQL? 写给Python程序员的MongoDB介绍 又一篇给Python程序员的

如何使用Hive集成Solr?

(一)Hive+Solr简介 Hive作为Hadoop生态系统里面离线的数据仓库,可以非常方便的使用SQL的方式来离线分析海量的历史数据,并根据分析的结果,来干一些其他的事情,如报表统计查询等. Solr作为高性能的搜索服务器,能够提供快速,强大的全文检索功能. (二)为什么需要hive集成solr? 有时候,我们需要将hive的分析完的结果,存储到solr里面进行全文检索服务,比如以前我们有个业务,对我们电商网站的搜索日志使用hive分析完后 存储到solr里面做报表查询,因为里面涉及到搜索关

spring boot教程 网盘下载

教程下载地址:https://u18103887.ctfile.com/fs/18103887-309551343 I. Spring Boot文档1. 关于本文档2. 获取帮助3. 第一步4. 使用Spring Boot5. 了解Spring Boot特性6. 迁移到生产环境7. 高级主题II. 开始8. Spring Boot介绍9. 系统要求9.1. Servlet容器10. Spring Boot安装10.1. 为Java开发者准备的安装指南10.1.1. Maven安装10.1.2.

Apache Storm 1.1.0 中文文档 | ApacheCN

前言  Apache Storm 是一个免费的,开源的,分布式的实时计算系统. 官方文档: http://storm.apache.org 中文文档: http://storm.apachecn.org ApacheCN 最近组织了翻译 Storm 1.1.0 中文文档 的活动,整体 翻译进度 为 96%. 感谢大家参与到该活动中来 感谢无私奉献的 贡献者,才有了这份 Storm 1.1.0 中文文档 感谢一路有你的陪伴,我们才可以做的更好,走的更快,走的更远,我们一直在努力 ... 网页地址:

《Beginning Hibernate-For Hibernate 5, 4th Edition》(01_导读介绍)

<Beginning Hibernate-For Hibernate 5, 4th Edition> 这是一本介绍Hibernate5的图书,Hibernate 5是Hibernate框架的最新版本,这是目前市面上唯一一本介绍Hibernate5特性的图书,图书的链接https://www.amazon.cn/%E5%9B%BE%E4%B9%A6/dp/1484223187/ref=sr_1_1?ie=UTF8&qid=1491804196&sr=8-1&keyword

Lind.DDD.Paging分页模块介绍

回到目录 分页组件网上有很多,MVC.Pager,JSPager等,通过实现方式大体分为前端分页和后端分页,前端分页是前台对list内存本地集合进行分页,缺点就是在大数据情况下,内存占用过高:后端分页就是UI把要返回的页号告诉后台,由后台组织数据并返回,这种方法就是我们经常看到的了:而根据后台集合种类又可以分类List和IQueryable,前者是本地集合,在返回数据时,直接把第几页共几条的集合返回:IQueryable是预查询集合,它是Linq的产物,在很多地里它不通用,除非你的ORM框架支持