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是非常easy的,不管是数据直接写还是延后写都支持。
以下我们回想一下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能够给应用带来低延迟的数据訪问特性(通过各种机制)。尤其是Hazelcastclient的就近缓存和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所不具备的。
最新文章
- git clone带用户名和密码的方式
- ajax基础了解
- vc++ 内存连续读写操作
- UIImageView旋转任意角度
- Android(java)学习笔记189:eclipse 导入项目是提示:某些项目因位于工作空间目录中而被隐藏。
- 【搜索】【并查集】Codeforces 691D Swaps in Permutation
- OneToMany与ManyToOne的属性
- JS(五)
- openstack组件手动部署整合
- android 拍照 onCreate() 调用两次的问题
- windows、linux创建子进程
- JS中小数的差,比较大小
- 解决Sublime Text 3中文显示乱码(tab中文方块)问题,sublime tab乱码
- 【Alpha阶段】第一次Scrum Meeting!
- 201521123035《Java程序设计》第一周学习总结
- [Swift]LeetCode42. 接雨水 | Trapping Rain Water
- shell速查
- WebClient请求接口,get和post方法
- Java Web(三) 会话机制,Cookie和Session详解(转载)
- py-day1-1 python的基本运算符和语句
热门文章
- 【LeetCode】Remove Duplicates from Sorted Array(删除排序数组中的重复项)
- TensorFlow学习笔记(6):TensorBoard之Embeddings
- 紫书第一章训练1 D -Message Decoding
- 【Luogu】P3950部落冲突(树链剖分)
- php-超全局变量
- HDU——1009FatMouse&#39; Trade(贪心+结构体+排序)
- 最里层的是child元素
- Spring配置SessionFactory
- 2016 Multi-University Training Contest 10 solutions BY BUPT
- iOS键盘中英文切换键盘高度获取通知方法