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,一经查实,立即删除!

相关文章

tcp java实例_实现了基于TCP的Java Socket编程实例代码

实现了基于TCP的Java Socket编程&#xff0c;功能很简单&#xff1a;客户端向服务器端输出一名话"connect"&#xff0c;服务器端接收输出到控制台并向客户端输出一名话"Hello",客户端接收并输出。1.服务器端package javase.net.socket;import java.io.Data…

java 批量上传图片插件_java多文件上传plupload控件实现多图片上传(一)

使用的是plupload-2.1.2 控件。网上资源挺多的&#xff0c;很好下载。plupload 官方地址 : http://www.plupload.com/plupload 示例: http://www.plupload.com/examples/plupload Github: https://github.com/moxiecode/plupload整体框架用的是easyui springMVC。1、前台jsp页…

java servlet_Java Servlet的前100个问题

java servlet1&#xff09;是“ servlets”目录还是“ servlet”目录&#xff1f; 回答&#xff1a; 对于Java Web Server&#xff1a; 在文件系统上&#xff0c;它是“ servlet” c&#xff1a;\ JavaWebServer1.1 \ servlets \ DateServlet.class 在URL路径中&#xff0c;…

精通java ee项目案例_精通JavaEE项目案例

第1章 Java EE开发入门 11.1 基本概念 11.1.1 Java EE API 11.1.2 MVC模型 21.1.3 JSP讨论 31.1.4 Servlet讨论 41.1.5 Model1和Model2 51.2 Eclipse 51.2.1 Eclipse的平台简介 61.2.2 Eclipse的体系结构 61.3 Struts 71.3.1 认识Struts 71.3.2 Strut…

java调用php session_php读取memcahed java session

情景&#xff1a;1&#xff1a;现在有两个系统&#xff0c;一个是Java做的系统&#xff0c;一个是PHP的系统&#xff0c;现在要把两个系统弄成一个单点登录。2&#xff1a;两个系统两个库&#xff0c;两个库的表结构完全不同&#xff0c;现在要解决的就是session共享问题和用户…

[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程序放进php_如何在php脚本中执行Java程序?

I have been struggling with this for awhile trying all sorts of options withno results – the file is never created(the file is created with an absolutepath so it’s not being created and Ijust can’t find the file). Does anyonehave any ideas?我认为问题是…

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

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

javafx响应式布局_JavaFX的响应式设计

javafx响应式布局使用CSS技术&#xff0c;为您的网站创建响应式设计相对容易。 根据屏幕的大小&#xff0c;您可以使用其他CSS文件和布局。 在JavaFX中&#xff0c;乍一看似乎有些困难&#xff0c;因为CSS仅负责样式&#xff0c;而不负责布局。 但是&#xff0c;为各个屏幕尺寸…

pojo java_什么是POJO,JavaBean?

什么是POJO&#xff0c;JavaBean&#xff1f;总结&#xff1a;POJO&#xff1a;一个简单的Java类&#xff0c;这个类没有实现/继承任何特殊的java接口或者类&#xff0c;不遵循任何主要java模型&#xff0c;约定或者框架的java对象。在理想情况下&#xff0c;POJO不应该有注解。…

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…

逸出 java_【java】知识系谱-基础篇-线程-发布、逸出

java并发编程实战的解释&#xff0c;不够详细&#xff0c;尤其this引用逸出让人理解有些费解&#xff0c;java并发编程实战里面的内容就直接拷贝过来发布&#xff1a;使对象能够在当前作用域之外的代码中使用逸出&#xff1a;当某个不该被发布的对象被发布时&#xff0c;这种情…

lambda java_Java Lambdas简介

lambda javaJava 8的主题是lambdas。 我已经注意到&#xff0c;对于许多Java程序员来说&#xff0c;lambda都是非常难的材料。 因此&#xff0c;让我们尝试对它们有一个基本的了解。 首先&#xff0c;lambda到底是什么&#xff1f; Lambda是一个匿名函数&#xff0c;与常规函数…

java mousepress_Java线程原语弃用

为什么是线程停止不赞成&#xff1f;因为它本质上是不安全的。停止线程会使其解锁其锁定的所有监视器。(当ThreadDeath异常在堆栈上传播时&#xff0c;监视器将被解锁。)如果以前受这些监视器保护的任何对象处于不一致状态&#xff0c;其他线程现在可能会以不一致的状态查看这些…

带有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…

@ParameterizedTest在@CvsSource中具有空值

在JUnit 4中编写参数化测试非常麻烦。 JUnit 5对框架进行了一些有用的改进&#xff0c;并且使用不同的参数运行相同的测试比以前的版本要简单得多。 但是&#xff0c;在这样的参数中传递空值存在一个小问题。 在这篇文章中&#xff0c;我将向您展示如何在JUnit 5中的Parametrz…

java正则断言_Java正则表达断言篇

正则表达式的先行断言和后行断言一共有4种形式&#xff1a;(?pattern) 零宽正向先行断言(zero-width positive lookahead assertion)(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)(?<pattern) 零宽正向后行断言(zero-width positive lookbehin…

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

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