介绍
我将在Hazelcast上做一个系列。 我从Twitter了解了该产品。 他们决定跟随我,经过对他们所做工作的研究后,我决定跟随他们。 我在推特上说,Hazelcast将是分布式密码破解者的重要Struts。 这引起了一些兴趣,我决定加入一个。 Hazelcast的副总裁开始与我联系,我们认为虽然饼干是一个好项目,但社区(和我)将从为初学者准备的一系列职位中受益。 在www.hazelcast.com上找到的《 哈兹卡斯特之书》预览中,我得到了很多很好的信息。
什么是淡褐色?
Hazelcast是一个分布式的内存数据库。 使用Hazelcast的世界各地都有项目。 该代码在Apache License 2.0下是开源的。
特征
Hazelcast中已经内置了许多功能。 这里是其中的一些:
- 自动发现网络上的节点
- 高可用性
- 内存备份
- 缓存数据的能力
- 分布式线程池
- 分布式执行器服务
- 在不同分区中具有数据的能力。
- 异步或同步保留数据的能力。
- 交易次数
- SSL支持
- 存储数据的结构:
- 清单
- 不同流程之间的通信结构
- 队列
- 原子操作
- 长寿
- ID生成
- IdGenerator
- 锁定
- 等量线
使用Hazelcast
只是和Hazelcast一起玩耍和阅读就教会了我去做这些事情。
- 数据将存储为字节数组。 (这不是一个假设,我是直接从书中得到的)
- 数据将通过网络传输。
- 数据是远程的。
- 如果数据不在内存中,则不存在。
让我解释这些假设:
数据将存储为字节数组
我从《榛子之书》中获得了这些信息,因此这并不是一个假设。 这很重要,因为不仅数据以这种方式存储, 密钥也是如此。 如果使用除基元或字符串以外的其他键作为键,这会使生活变得非常有趣。 hash()和equals()的开发人员必须以键的形式考虑它,将其视为字节数组而不是类。
数据将通过网络
这是一个分布式数据库,因此部分数据将存储在其他节点中。 也有备份和缓存。 有一些技术和设置可以减少通过网络传输数据的速度,但如果要获得高可用性,则必须进行备份。
数据是远程的
这是一个分布式数据库,因此数据库的一部分将存储在其他节点上。 我提出这个假设并不是要屈服于数据是远程的事实,而是要激励设计以确保在大多数数据所在的位置执行操作。 如果开发人员足够熟练,则可以将其降至最低。
如果数据不在内存中,则不存在
不要忘记这是一个内存数据库。 如果未将其加载到内存中,则数据库将不知道数据存储在其他位置。 该数据库不会保留数据以备以后使用。 之所以持续存在,是因为数据很重要。 一旦它内存不足,就无法像传统数据库( MySQL)那样将其从磁盘中带回。
数据存储
Java开发人员将很高兴知道Hazelcast的数据存储容器(其中一个是java.util.Collections接口的扩展)除外。 例如,一个IList遵循与java.util.List相同的方法协定。 以下是不同数据存储类型的列表:
- IList –这使许多对象按其放入顺序排列
- IQueue –在BlockingQueue之后,可以用作JMS中的Message Queue的替代。 这可以通过QueueStore保留
- IMap –这扩展了ConcurrentMap。 它也可以由MapStore保留。 它还具有许多其他功能,我将在另一篇文章中讨论。
- ISet –保留一组唯一的元素,这些元素不能保证顺序。
- MultiMap –它不遵循典型的地图,因为每个键可以有多个值。
例
设定
对于Hazelcast包含的所有功能,初始设置步骤非常简单。
- 下载在Hazelcast zip文件www.hazelcast.org和提取内容。
- 将在lib目录中找到的jar文件添加到一个人的类路径中。
- 创建一个名为hazelcast.xml的文件,并将以下内容放入文件中
<?xml version="1.0" encoding="UTF-8"?>
<hazelcast
xsi:schemaLocation ="http://www.hazelcast.com/schema/config
http://www.hazelcast.com/schema/config/hazelcast-config-3.0.xsd "
xmlns ="http://www.hazelcast.com/schema/config "
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"><network><join><multicast enabled="true"/></join></network><map name="a"></map>
</hazelcast>
Hazelcast在一些地方查找配置文件:
- 由hazelcast.config属性定义的路径
- 如果类路径包含在hazelcast.config中,则类路径中的hazelcast.xml
- 工作目录
- 如果其他所有方法均失败,则将hazelcast-default.xml加载到hazelcast.jar中。
- 如果根本不想处理配置文件,则可以以编程方式完成配置。
此处的配置示例定义了用于加入的多播。 它还定义了IMap“ a”。
关于配置的警告
Hazelcast不会将配置复制到每个节点。 因此,如果希望能够共享一种数据结构,则需要在每个节点中完全相同地定义它。
码
这段代码调出了两个节点,并使用IdGenerator将值放在实例的IMap中,以生成键并从instance2读取数据。
package hazelcastsimpleapp;import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IdGenerator;
import java.util.Map;/**** @author Daryl*/
public class HazelcastSimpleApp {/*** @param args the command line arguments*/public static void main(String[] args) {HazelcastInstance instance = Hazelcast.newHazelcastInstance();HazelcastInstance instance2 = Hazelcast.newHazelcastInstance();Map map = instance.getMap("a");IdGenerator gen = instance.getIdGenerator("gen");for(int i = 0; i < 10; i++) {map.put(gen.newId(), "stuff " + i);}Map map2 = instance2.getMap("a");for(Map.Entry entry: map2.entrySet()) {System.out.printf("entry: %d; %s\n", entry.getKey(), entry.getValue());}System.exit(0);}}
非常简单,不是吗! 请注意,检索地图实例时,我什至没有使用IMap接口。 我只是使用java.util.Map接口。 这不利于使用Hazelcast的分布式功能,但在此示例中,它工作正常。
在这里可以观察到工作中的假设。 第一个假设是将信息存储为字节数组。 注意数据和密钥是可序列化的。 这很重要,因为这是存储数据所必需的。 第二个和第三个假设适用于instance2节点正在访问的数据。 第四个假设成立是因为读取时会显示放入“ a”映射中的每个值。 使用subversion可以在http://darylmathisonblog.googlecode.com/svn/trunk/HazelcastSimpleApp中找到所有这些示例。 该项目是使用Netbeans 8.0进行的。
结论
通过显示IMap和IdGenerator的简单示例回顾了Hazelcast众多功能的快速概述。 讨论了在分布式内存数据库环境中开发时适用的一系列假设。
资源资源
榛子之书。 从http://www.hazelcast.com下载
翻译自: https://www.javacodegeeks.com/2014/10/beginners-guide-to-hazelcast-part-1.html