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. 罗德·约翰逊(Rod Johnson)是的,斯普林先生现在是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的Blog博客上的JCG合作伙伴 Roger Hughes的Hazelcast入门 。

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

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

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

相关文章

android手机最低内存,原神手机端需要哪些配置 手机端最低配置要求介绍

原神是一款由米哈游自主研发的全新开放世界冒险游戏&#xff0c;游戏最近迎来了pc端的首次测试&#xff0c;而且在不久之后就会开启原神手机端的公测版本&#xff0c;那么手机端需要什么配置呢&#xff1f;小编带来了详细的介绍。移动端预下载&#xff1a;9月25日下午16&#x…

AnswerOpenCV一周佳作欣赏(0615-0622)

一、How to make auto-adjustments(brightness and contrast) for image Android Opencv Image Correctionim using OpenCV for Android. I would like to know,how to make image correction(auto adjustments of brightness/contrast) for image(bitmap) in android via Open…

所有其他指标均无用

对于队列&#xff0c;无论是实现为JMS &#xff0c;数据库表&#xff08;即Ruby的Delayed :: Job用于队列的什么&#xff09;&#xff0c;甚至是Amazon的SQS &#xff0c;用于评估队列状态的最常见指标是其长度。 从本质上讲&#xff0c;可以基于在任何给定时间队列中驻留多少消…

类似苹果数据线的android,除了常见的安卓、苹果、Type-c,还有哪些你不知道的手机数据线?...

随着智能手机日益发展&#xff0c;辅助智能手机的数据线配件也越来越多样。现在我们最常见的无非就是标准Micro usb口、正反随便插的Type-c接口、还有苹果Lightning数据线&#xff0c;那么除了这些类型数据线&#xff0c;你知道如今市面上还有哪些更方便好用的手机数据线吗&…

canvas入门实战--邀请卡生成与下载

1.前言 写了很多的javascript和css3的文章&#xff0c;是时候写一篇canvas的了。canvas是html5提供的一个新的功能&#xff01;至于作用&#xff0c;就是一个画布。然后画笔就是javascript。canvas的用途非常的广&#xff0c;特别是html5游戏以及数据可视化这两个方面。现在can…

Apache ActiveMQ 5.9发布

Apache ActiveMQ团队刚刚发布了新的ActiveMQ 5.9版本 。 Apache ActiveMQ 5.9发布 自从先前的5.8版本以来&#xff0c;此版本是8个月的辛苦工作。 在此发行版中&#xff0c;我们将像往常一样对代理进行增强&#xff0c;并使用最新的协议&#xff08;例如AMQP和MQTT&#xff…

android 美颜录像,Android 关于美颜/滤镜 利用PBO从OpenGL录制视频

前言上次我写了一遍文章《Android 关于美颜/滤镜 从OpenGl录制视频的一种方案》&#xff0c;里面利用ImageReader来从获取Surface上获取数据&#xff0c;但是经过熊皮皮的提醒&#xff0c;我发现多PBO的确可以实现跟ImageReader一样的效果&#xff0c;并且版本要求仅为Android4…

Java对象到对象映射器

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

android媒体播放框架,Android 使用超简单的多媒体播放器JiaoZiVideoPlayer

在之前的项目中用到了视频播放的功能&#xff0c;在网上看了看使用了大家用的比较多的一个开源项目JiaoZiVideo可以迅速的实现视频播放的相关功能。JiaoZiVideo的简单使用集成了JiaoZiVideo后仅需这几行代码就可以实现播放视频JZVideoPlayerStandard jzVideoPlayerStandard (J…

送福利:ROKID 语音开发板免费送,开启你的物联网之旅

都让一让&#xff0c;我说个事情&#xff1a;掘金联合 Rokid 开发者社区给大家发福利啦&#xff01; 掘金联合 Rokid 开发者社区为大家准备了一些福利&#xff0c;只要秀出你的 skill 和技术栈&#xff0c;就有可能获得 Rokid 全栈语音智能开发套件。 ? Rokid开箱试用活动 活…

如何使用JavaScript控制台改进工作流程

作为Web开发人员&#xff0c;很有必要了解如何调试代码。后台开发我们经常使用外部库来记录日志&#xff0c;并在某些情况下格式化显示日志&#xff0c;前端我们会使用断点和控制台&#xff0c;但是我们浏览器的控制台比我们想象的要强大得多。 当我们考虑控制台时&#xff0c…

select、poll、epoll之间的区别总结[整理]

原文:https://www.cnblogs.com/Anker/p/3265058.html 好文章收藏下&#xff0c;慢慢品味 select&#xff0c;poll&#xff0c;epoll都是IO多路复用的机制。I/O多路复用就通过一种机制&#xff0c;可以监视多个描述符&#xff0c;一旦某个描述符就绪&#xff08;一般是读就绪或者…

JPA(七):映射关联关系------映射双向多对一的关联关系

映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone;import java.util.Date; import java.util.HashSet; import java.util.Set;import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; impo…

如何优雅的绘制一棵省市区三级可选择的树?

开始 总结一下 开发过程中的思路想法 各位大佬们看看就好 首先你拥有的数据结构 所有省市区的信息列表 以及已经选中的信息 用的是element-ui的 el-tree const cityStorage {provinceList:[{id: 1, provinceId: "110000", name: "北京市"}],//所有省ci…

html click事件 参数,vue 实现click同时传入事件对象和自定义参数

这篇文章主要介绍了vue 实现click同时传入事件对象和自定义参数&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。一起跟随小编过来看看吧仅仅传入自定义参数HTMLdddddJS代码new Vue({el:#app,methods:{tm:function(e){console.log(e);}}})仅仅传入事件对象HTML…

Android学习(七)—— Android布局

Android布局 1、LinearLayout 线性布局&#xff0c;这种布局在平时的开发中用的最多&#xff0c;内部控件只能水平或竖直进行排列&#xff0c;在搭建较复杂的界面时会有点麻烦。 常用属性 android:orientation 控制控件排列方向&#xff0c;属性值为垂直&#xff08;vertical…

不一样的ZTree,权限树.js插件

每一个有趣的创新&#xff0c;都源于苦逼的生活。在最近的工作中&#xff0c;遇到一个做权限管理筛选的需求。 简单总结需求&#xff1a; 1展示一个组织中的组织结构 2通过点击组织结构中的任意一个节点可以向上向下查询对应的组织结构 如果你不想苦逼的重复劳动&#xff0c;还…

JavaFX 2:如何加载图像

这是有关如何在JavaFX 2应用程序中加载图像的JavaFX教程。 使用ImageView可以轻松完成此操作。 ImageView是一个节点&#xff0c;用于绘制加载有Image类的图像。 因此&#xff0c;您将首先使用Image类加载图像&#xff0c;然后使用ImageView显示它。 我还将在这里演示如何从本地…

记HTML5 a 标签的一个小坑

今天写了段简单的代码&#xff0c;点击<a>标签时却抛出了这个错误&#xff1a;Uncaught TypeError: download is not a function。代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><…

C#线程 ---- 线程同步详解

线程同步 说明&#xff1a;接上一篇&#xff0c;注意分享线程同步的必要性和线程同步的方法。 测试代码下载&#xff1a;https://github.com/EkeSu/C-Thread-synchronization-C-.git 一、什么是线程同步&#xff1a; 在同一时间只允许一个线程访问资源的情况称为线程同步。 二、…