hazelcast入门教程_Hazelcast入门

hazelcast入门教程

7月,我写了一个博客向Java开发人员介绍erlang,重点介绍了这两种语言之间的一些异同。 erlang虚拟机具有许多令人印象深刻的内置功能,其中之一是它们独立于位置且可以相互通信。 这意味着可以通过编写很少的代码行在VM之间同步数据。 如果您有一个网络集群的服务器都在做相同的事情,这真是个好消息。

您可能会争辩说,即使JVM无法执行最基本的进程间通信,也可能缺少某些东西。 但是,Java却持相反的观点,它拥有基本的VM,然后在需要时在其上分层放置不同的服务。 这是否正确只是一个见解,我将其作为以后博客的主题,因为Hazelcast Guys似乎已经解决了JVM之间相互交谈的问题; 这是本博客的重点。

那么,什么是Hazelcast?

Hazelcast新闻稿是这样的:“ Hazelcast( www.hazelcast.com )正在通过开放源代码重塑内存数据网格。 Hazelcast提供了一个嵌入式库,任何Java开发人员都可以在几分钟之内包含该库,从而使他们能够构建优雅而简单的关键任务,事务性和万亿级内存应用程序。”

那么,这到底意味着什么?

好的,那只是营销/公关障碍。 在现实生活中,什么是Hazelcast? 可以使用代码简洁地给出答案。 假设您正在编写一个应用程序,并且需要一个Map<String,String>而在生产环境中,您将在集群中拥有多个应用程序实例。 然后编写以下代码:

HazelcastInstance instance = Hazelcast.newHazelcastInstance(); loggedOnUsers = instance.getMap("Users");

…意味着,应用程序的一个实例添加到地图的数据可用于应用程序的所有其他实例2

您可以从中得出几点。 首先,Hazelcast节点是“无主节点”,这意味着它不是客户端服务器系统。 有一个集群领导者,默认情况下是集群中最老的成员,它负责管理数据在系统中的分布方式。 但是,如果该节点发生故障,则下一个最旧的节点将接管。

拥有一堆分布式的地图,列表,队列等,意味着一切都保存在内存中。 如果集群中的一个节点死亡,那么您就可以了,不会有数据丢失; 但是,如果多个节点同时死亡,那么您将遇到麻烦,并且由于系统没有时间重新平衡自身,您将丢失数据。 不用说,如果整个集群都死了,那么您将遇到大麻烦。

那么,为什么Hazelcast是一个好选择?

  1. 它是开源的。 通常这是一件好事……
  2. Hazelcast刚刚收到了巨额现金注入,以“商品化”该产品。 有关更多信息,请在这里和这里看看。
  3. 罗德·约翰逊,是的斯普林先生,现在是Hazelcast的董事会成员。
  4. 它只是工作1
  5. 入门非常容易。

场景

为了演示Hazelcast,请想象您正在编写一个应用程序,在这种情况下,该应用程序是由MyApplication类建模的,然后有一个很大的用户世界,如BigWideWorld类所建模。 正如预期的那样,来自BigWideWorld用户登录并注销了您的应用程序。 您的应用程序非常受欢迎,并且您正在集群中运行它的多个实例,因此,当用户登录该应用程序的实例时,它会将其详细信息(由User类建模)存储在Map以及Map的内容与您的应用程序其他实例保存的地图同步。

屏幕截图2013年10月21日在20.45.28

POM配置

首先要做的是设置POM.xml,只有一个条目要考虑:

<dependency><groupId>com.hazelcast</groupId><artifactId>hazelcast</artifactId><version>3.1</version></dependency>

代码

BigWideWorld是代码的起点,对于这么大的概念而言,这是一个很小的类。 它有一个方法nextUser() ,它从所有应用程序用户的集合中随机选择下一个要登录或注销的用户的名称。

public class BigWideWorld { private static Random rand = new Random(System.currentTimeMillis()); private final Users users = new Users(); private final int totalNumUsers = users.size(); public String nextUser() { User user = users.get(rand.nextInt(totalNumUsers)); String name = user.getUsername(); return name; } }

用户集合由Users类管理。 这是一个示例代码便捷类,其中包含许多硬编码用户的详细信息。

public class Users { /** The users in the database */ private final User[] users = { new User("fred123", "Fred", "Jones", "fredj@a.com"), new User("jim", "Jim", "Jones", "jimj@a.com"), new User("bill", "Bill", "Jones", "bill@a.com"), new User("ted111", "Edward", "Jones", "tedj@a.com"), new User("annie", "Annette", "Jones", "annj@a.com"), new User("lucy", "Lucy", "Jones", "lucyj@a.com"), new User("jimj", "James", "Jones", "jimj@a.com"), new User("jez", "Jerry", "Jones", "fredj@a.com"), new User("will", "William", "Jones", "willj@a.com"), new User("shaz", "Sharon", "Jones", "shazj@a.com"), new User("paula", "Paula", "Jones", "pauj@a.com"), new User("leo", "Leonardo", "Jones", "leoj@a.com"), }; private final Map<String, User> userMap; public Users() { userMap = new HashMap<String, User>(); for (User user : users) { userMap.put(user.getUsername(), user); } } /** * The number of users in the database */ public int size() { return userMap.size(); } /** * Given a number, return the user */ public User get(int index) { return users[index]; } /** * Given the user's name return the User details */ public User get(String username) { return userMap.get(username); } /** * Return the user names. */ public Set<String> getUserNames() { return userMap.keySet(); } 
}

此类包含一些数据库类型的调用,例如get(String username)返回给定名称的用户对象,或者get(int index)返回数据库中的给定用户,或者size()返回数字。数据库中的用户数量。

用户由User类描述; 一个简单的Java bean:

public class User implements Serializable { private static final long serialVersionUID = 1L; private final String username; private final String firstName; private final String lastName; private final String email; public User(String username, String firstName, String lastName, String email) { super(); this.username = username; this.firstName = firstName; this.lastName = lastName; this.email = email; } public String getUsername() { return username; } public String getFirstName() { return firstName; } public String getLastName() { return lastName; } public String getEmail() { return email; } @Override public String toString() { StringBuilder sb = new StringBuilder("User: "); sb.append(username); sb.append(" "); sb.append(firstName); sb.append(" "); sb.append(lastName); sb.append(" "); sb.append(email); return sb.toString(); } 
}

继续讨论博客的症结所在,这就是MyApplication类。 本博客中的大多数代码只是橱窗装饰,重要的代码在MyApplication的构造函数中。 该构造包含两行代码。 第一个使用新的Hazelcast实例,而第二个使用该实例创建名称空间为“ Users”的Map<String, User> 。 这就是所需的所有Hazelcast特定代码。 其他方法: logon()logout()isLoggedOn()仅管理用户。

使用简单的Main类将以上所有内容捆绑在一起:

public class Main { public static void main(String[] args) throws InterruptedException { BigWideWorld theWorld = new BigWideWorld(); MyApplication application = new MyApplication(); while (true) { String username = theWorld.nextUser(); if (application.isLoggedOn(username)) { application.logout(username); } else { application.logon(username); } application.displayUsers(); TimeUnit.SECONDS.sleep(2); } } }

此代码创建BigWideWorldMyApplication的实例。 然后,它无限循环地抓住下一个随机用户名。 如果用户已经登录,则该用户注销。 如果用户未登录,则用户将登录。然后将显示已登录的用户,以便您查看正在发生的情况。

运行应用

构建应用程序后,打开终端并导航到project target/classes目录。 然后输入以下命令:

java -cp /your path to the/hazelcast-3.1/lib/hazelcast-1.jar:. com.captaindebug.hazelcast.gettingstarted.Main

运行时,您将获得如下所示的输出:

Logged on users:
User: fred123 Fred Jones fredj@a.com
User: jimj James Jones jimj@a.com
User: shaz Sharon Jones shazj@a.com
User: paula Paula Jones pauj@a.com
User: lucy Lucy Jones lucyj@a.com
User: jez Jerry Jones fredj@a.com
User: jim Jim Jones jimj@a.com
7 -- 14:54:16-17

接下来,打开更多终端并运行您的应用程序的更多实例。

如果您跟踪输出,则可以看到用户登录和注销,并且每次更改都显示用户Map 。 一个应用程序的地图更改反映在其他实例中的线索可能很难发现,但可以从地图的总大小(输出最后一行的第一个数字)中得出。 每次显示地图时,都会有一个用户登录或注销。 但是,总大小可能会改变一个以上,这意味着其他实例的更改已影响您正在查看的地图的大小。

屏幕截图2013年10月21日在22.22.21

因此,您有一个简单的应用程序,当四个实例运行时,它们保持同步并知道哪些用户已登录。

它应该可以在大型群集中工作,但是我从未尝试过。 显然,在大型集群中,您必须对配置文件进行一些麻烦,但这超出了本博客的范围。

1好的,足够的市场营销能力。 总的来说,它“确实可行”,但是请记住,它是由像您和我这样的开发人员编写的软件,它确实具有功能特质 。 举例来说,如果你还在使用2.4版本,然后立即升级。 这会有内存泄漏,这意味着它在感觉到时“只是默默地停止工作”。 最新版本是3.1。

2我选择了Map作为示例,但对于其他集合类型(如ListSetQueue也是如此,另外Hazelcast还具有许多其他功能,这些功能超出了本博客的范围,包括大量并发实用程序和发布/订阅消息传递。

  • 该博客的代码可在github上找到: https : //github.com/roghughe/captaindebug/tree/master/hazelcast

参考:来自Captain Debug博客博客的JCG合作伙伴 Roger Hughes的Hazelcast入门 。

翻译自: https://www.javacodegeeks.com/2013/11/getting-started-with-hazelcast.html

hazelcast入门教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[MEGA DEAL]完整的Java编程训练营(94%折扣)

成为Java Master的10门课程&#xff08;83.5小时&#xff09;&#xff1a;使用JavaFX的设计UI&#xff0c;利用设计模式&#xff0c;Master Multithreading等 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了另一个超值优惠…

java重排序_Java内存模型FAQ(四)重排序意味着什么?

译者&#xff1a;Alex在很多情况下&#xff0c;访问一个程序变量(对象实例字段&#xff0c;类静态字段和数组元素)可能会使用不同的顺序执行&#xff0c;而不是程序语义所指定的顺序执行。编译器能够自由的以优化的名义去改变指令顺序。在特定的环境下&#xff0c;处理器可能会…

JVM体系结构101:了解您的虚拟机

Java虚拟机&#xff08;JVM&#xff09;架构和Java字节码101的初学者速成班 Java应用程序无处不在&#xff0c;它们在我们的手机&#xff0c;平板电脑和计算机上。 在许多编程语言中&#xff0c;这意味着要多次编译代码才能使其在不同的OS上运行。 对于作为开发人员的我们来说…

flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查

Flask-SQLAlchemy对数据库增删改查安装pip install flask-sqlalchemy具体不多说了&#xff0c;主要是对数据库进行简单的增删改查&#xff0c;上代码&#xff0c;看注释app.route(/)def index():#增加article1 Article(titletest1, contentthe first test)db.session.add(arti…

带有Jersey的JAX-RS教程,用于RESTful Web服务

在当今世界&#xff0c;数据扮演着非常重要的角色。 如此众多的应用程序将各种类型的数据用于不同的操作&#xff0c;所以最重要的方面是应用程序之间的通信。 当应用程序可以通信时&#xff0c;它们之间的数据共享变得容易。 就像在亚洲运行的应用程序向在欧洲运行的应用程序…

java swing 打开文件_java swing实现打开Excel文件并进行处理

这里选择Excel文件是业务需要&#xff0c;话不多说1、引入对Excel处理的相关依赖org.apache.poipoi3.16org.apache.poipoi-ooxml3.162、进行swing的相关布局代码&#xff1a;package com.mozarta;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.xssf.usermodel…

java的对象对象映射_Java对象到对象映射器

java的对象对象映射我在该项目上使用了Dozer一段时间。 但是&#xff0c;最近我遇到了一个非常有趣的错误&#xff0c;这促使我环顾四周&#xff0c;并尝试使用其他“对象到对象”映射器。 这是我找到的工具列表&#xff1a; 推土机&#xff1a;推土机是Java Bean到Java Bea…

java parallelstream_关于Java8 parallelStream并发安全的深入讲解

背景Java8的stream接口极大地减少了for循环写法的复杂性&#xff0c;stream提供了map/reduce/collect等一系列聚合接口&#xff0c;还支持并发操作&#xff1a;parallelStream。在爬虫开发过程中&#xff0c;经常会遇到遍历一个很大的集合做重复的操作&#xff0c;这时候如果使…

使用Google Cloud Storage托管您的Maven工件

如果您使用Google Cloud并将Java用于项目&#xff0c;那么Google Cloud Storage是托管团队工件的理想场所。 它很容易设置&#xff0c;而且很便宜。 如果您对它们的功能不特别感兴趣&#xff0c;那么它比设置现有存储库选项&#xff08;jfrog&#xff0c;nexus&#xff0c;arc…

java+map对象判断空值_java判断map中是否存在指定对象

Map判断是否包含指定的value使用containsValue方法。(推荐&#xff1a;java视频教程)定义containsValue(Object value) 如果此映射将一个或多个键映射到指定值&#xff0c;则返回 true示例&#xff1a;/**** Map集合判断是否包含value**/public class MapDemo{public static vo…

excel查重复_毕业季 | 如何降低论文的查重率

毕业季吾日三省吾身实验做完了吗&#xff1f;论文写完了吗&#xff1f;查重能通过吗&#xff1f;学术圈的前辈告诉我们&#xff0c;只有站在巨人的肩膀上才能看得更远。在撰写一篇论文时&#xff0c;为保证质量和可靠性&#xff0c;难免需要引用前人的成果&#xff0c;这也反映…

Java,JavaFX的流畅设计风格进度栏

按照承诺&#xff0c;刚刚发布的Java JavaFX主题JMetro 4.6版为进度栏带来了新样式。 进度栏有两种可能的状态&#xff1a;确定和不确定&#xff0c;新的JMetro版本具有这两种状态。 在本文中&#xff0c;我还将详细介绍一些我在JMetro中遵守的API设计原则。 JMetro API设计原…

安卓最新系统_成纺移动校园(移动办公系统)V3.2.1 安卓最新版

成纺移动校园(移动办公系统)是额一个非常实用的办公工具。您可以使用该软件及时浏览最新的校园信息&#xff0c;同时涵盖许多功能&#xff0c;例如时间表查询&#xff0c;会议安排&#xff0c;校园地图&#xff0c;校车等。有需要的用户欢迎来绿色先锋网下载。 成纺移动校园简介…

pyqt 获取 UI 中组件_你想知道的React组件设计模式这里都有(上)

本文梳理了容器与展示组件、高阶组件、render props这三类React组件设计模式往期回顾&#xff1a;HBaseCon Asia 2019 Track 3 概要回顾随着 React 的发展&#xff0c;各种组件设计模式层出不穷。React 官方文档也有不少相关文章&#xff0c;但是组织稍显凌乱&#xff0c;本文就…

typora导出word指定样式_(二)最简洁的Markdowd编辑器:Typora

&#xff08;提醒&#xff1a;前面都是介绍和语法&#xff0c;想下载了就能用的直接看最后总结&#xff09;大家好&#xff0c;半瓶醋同学又来误人子弟了。现在办公文档或者邮件的处理&#xff0c;一般都是用微软的office word或者邮件自带的编辑器。但是用word或者邮件自带编辑…

使用数据库中的Java流制作数据透视表

来自数据库行和表的原始数据不能为人类读者提供太多了解。 相反&#xff0c;如果我们对数据执行某种聚合&#xff0c;则人类更有可能看到数据模式 在展示给我们之前。 数据透视表是聚合的一种特定形式&#xff0c;我们可以在其中应用排序&#xff0c;求平均值或求和之类的操作…

asynchttpclient 超时_dnf这才是混子的毕业套装,却发现超时空漩涡不买账!

dnf这才是混子的毕业套装&#xff0c;却发现超时空漩涡不买账&#xff01;按道理来说&#xff0c;光兵和帕拉丁穿这套装备去混团是最好的&#xff0c;结果现在超时空漩涡不要&#xff01;虽然说兵法套是95最好的魂之涛&#xff0c;但是这个混子套属性真心弱爆&#xff0c;不如正…

win7亮度怎么调_揭秘极米NEW Z8X投影仪怎么样?千万不要上当?!!!!【揭秘反馈

反馈测评极米NEW Z8X投影仪怎么样?求真实点评注意事项极米NEW Z8X投影仪怎么样?靠谱真实回答 外形外观&#xff1a;简约时尚大气&#xff0c;手感不错&#xff01;\n投影亮度&#xff1a;1080P、4K&#xff0c;都能做到&#xff01;\n投影色彩&#xff1a;非常好&#xff0c;…

Paw 百度ai_直面落地!百度EasyDL产业智能创新大赛成果覆盖能源、交通、水利民生重业...

物体检测模型实现高压线路隐患检测、图像分类实现短视频快速剪辑和量产、文本情感分类辅助潜在心理疾病患者自发检测、图片识别车辆轮轴数监管车辆载重……每一个创想都能简单快速实现&#xff0c;没有AI开发基础的小伙伴们也能做到&#xff01;这一切都缘于百度零门槛AI开发平…

Java 9、10及更高版本:Java平台的未来

您紧跟Java平台新功能的秘密武器 自去年9月发布Java 9以来&#xff0c;感觉整个平台都经历了重大变化。 在我们甚至无法确定Java 9所能提供的一切之前&#xff0c;我们已经在标记Java 10的发布。现在&#xff0c;我们已经开始期待Java 11在2018年9月发布。 Oracle决定为Java平…