`

Hazelcast入门教程

阅读更多
 Hazelcast (www.hazelcast.com])是一种内存数据网格 in-memory data grid,提供Java程序员关键任务交易和万亿级内存应用。

Hazelcast的集群属于“无主节点”,这意味着它不是一个客户端 - 服务器系统。有一个集群的领导者,默认是最老的成员,管理数据是如何在系统间分布,但是,如果该节点当机,那么是下面一个旧的节点接管。

你所用的数据结构Maps List和队列都是保存在内存中。如果集群中的一个节点死亡,数据不会丢失,但如果多个节点同时当机,那么你就麻烦了

下面以BigWideWorl为案例说明Hazelcast的使用,首先依赖包导入:

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


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;       
  }       
}


nextUser()方法可以随机获得一个用户的名称,用户集合由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(); 
  } 
}


Users其实类似一个Map集合。下面是用户类:

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(); 
  } 
}


用户User必须实现序列化接口。

客户端调用代码如下:
  public static void main(String[] args) throws InterruptedException {

    MyApplication application = new MyApplication();

      String username = theWorld.nextUser();
      if (application.isLoggedOn(username)) { 
        application.logout(username); 
      } else { 
        application.logon(username); 
      }
      application.displayUsers(); 
      TimeUnit.SECONDS.sleep(2); 
    } 
  }


此代码创建BigWideWorld和所有MyApplication的实例。然后,它无限循环抓住抓取下一个随机的用户名。如果是已经登录的用户,那么注销该用户。如果没有登录的用户,然后登录用户后显示。

运行该代码:

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集合每次显示出改变,关键是:一个应用的Map大小变化会影响其他窗口应用内的大小,好像大家共用一个Users的Map集合。

发布者和订阅者实现

假设有一个模型:
public class StockPrice implements Serializable {

  private final BigDecimal bid;

  private final String code;

  private final long timestamp;
  /** 
   * Create a StockPrice for the given stock at a given moment 
   */ 
  public StockPrice(BigDecimal bid, BigDecimal ask, String code, String description,
      long timestamp) { 
    super(); 
    this.bid = bid; 
    this.ask = ask; 
    this.code = code; 
    this.description = description; 
    this.timestamp = timestamp; 
  }
  public BigDecimal getBid() { 
    return bid; 
  }
  public BigDecimal getAsk() { 
    return ask; 
  }
  public String getCode() { 
    return code; 
  }
  public String getDescription() { 
    return description; 
  }
  public long getTimestamp() { 
    return timestamp; 
  }
  @Override 
  public String toString() {
    StringBuilder sb = new StringBuilder(&quot;Stock - &quot;); 
    sb.append(code); 
    sb.append(&quot; - &quot;); 
    sb.append(description); 
    sb.append(&quot; - &quot;); 
    sb.append(description); 
    sb.append(&quot; - Bid: &quot;); 
    sb.append(bid); 
    sb.append(&quot; - Ask: &quot;); 
    sb.append(ask); 
    sb.append(&quot; - &quot;); 
    SimpleDateFormat df = new SimpleDateFormat(&quot;HH:MM:SS&quot;); 
    sb.append(df.format(new Date(timestamp))); 
    return sb.toString(); 
  } 
}


要求将股票的买入卖出价格在任何时间发布给做市商。

发布者代码:

 private static Random random = new Random();

  private final String description;

  private volatile boolean running;
  public MarketMaker(String topicName, String stockCode, String description) { 
    this.stockCode = stockCode; 
    this.description = description; 
    this.topic = createTopic(topicName); 
    running = true; 
  }
  @VisibleForTesting 
  ITopic createTopic(String topicName) { 
    HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(); 
    return hzInstance.getTopic(topicName); 
  }

    Thread thread = new Thread(this); 
    thread.start(); 
  }
  @Override 
  public void run() {
    do { 
      publish(); 
      sleep(); 
    } while (running); 
  }

    StockPrice price = createStockPrice(); 
    System.out.println(price.toString()); 
    topic.publish(price); 
  }
  @VisibleForTesting 
  StockPrice createStockPrice() {
    double price = createPrice(); 
    DecimalFormat df = new DecimalFormat(&quot;#.##&quot;);
    BigDecimal bid = new BigDecimal(df.format(price - variance(price))); 
    BigDecimal ask = new BigDecimal(df.format(price + variance(price)));
    StockPrice stockPrice = new StockPrice(bid, ask, stockCode, description, 
        System.currentTimeMillis()); 
    return stockPrice; 
  }

    int val = random.nextInt(2010 - 1520) + 1520; 
    double retVal = (double) val / 100; 
    return retVal; 
  }
  private double variance(double price) { 
    return (price * 0.01); 
  }
  private void sleep() { 
    try { 
      TimeUnit.SECONDS.sleep(2); 
    } catch (InterruptedException e) { 
      e.printStackTrace(); 
    } 
  }
  public void stop() { 
    running = false; 
  }

    MarketMaker bt = new MarketMaker(&quot;STOCKS&quot;, &quot;BT.L&quot;, &quot;British Telecom&quot;); 
    MarketMaker cbry = new MarketMaker(&quot;STOCKS&quot;, &quot;CBRY.L&quot;, &quot;Cadburys&quot;); 
    MarketMaker bp = new MarketMaker(&quot;STOCKS&quot;, &quot;BP.L&quot;, &quot;British Petrolium&quot;);
    bt.publishPrices(); 
    cbry.publishPrices(); 
    bp.publishPrices();

}


其中代码关键是:
  ITopic createTopic(String topicName) { 
    HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(); 
    return hzInstance.getTopic(topicName); 
  }



这是设置Hazelcast,创建一个主题topic用于股票发布。真正发布是在run方法中的topic.publish(price);

订阅者代码如下:

 public Client(String topicName) { 
    HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(); 
    ITopic topic = hzInstance.getTopic(topicName); 
    topic.addMessageListener(this); 
  }
  /** 
   * @see com.hazelcast.core.MessageListener#onMessage(com.hazelcast.core.Message) 
   */ 
  @Override 
  public void onMessage(Message arg0) { 
    System.out.println(&quot;Received: &quot; + arg0.getMessageObject().toString()); 
  }

    new Client('STOCKS"); 
  }


下面是运行,需要配合两个包:hazel cast-3.1.jar and guava-13.0.1.jar.

下面是订阅者运行:
java -cp ./:/Users/Roger/tmp/mm/guava-13.0.1.jar:/Users/Roger/tmp/mm/hazelcast-3.1.jar com.captaindebug.hazelcast.pubsub.Client
分享到:
评论

相关推荐

    [Hazelcast] Hazelcast 入门教程 (英文版)

    [Packt Publishing] Hazelcast 入门教程 (英文版) [Packt Publishing] Getting Started with Hazelcast (E-Book) ☆ 图书概要:☆ An easy-to-follow and hands-on introduction to the highly scalable data ...

    hazelcast 文档

    Hazelcast是一款专为Java设计的...Hazelcast文档还包含了3.1.3版本的更新日志、新特性介绍、从2.x版本升级指南,以及入门教程。文档的版权归属于2013 Hazelcast, Inc.,允许人们自由使用、复制、修改和分发这份文档。

    Spring Boot 教程、技术栈示例代码,快速简单上手教程。

    - 缓存:如 Redis、Hazelcast。 **5. 安全管理** Spring Boot 集成了 Spring Security,提供身份验证和授权功能。默认配置下,所有 HTTP 请求都是受保护的,可以通过添加 `@EnableWebSecurity` 开启自定义安全配置...

    trident-tutorial:实用的Storm Trident教程

    三叉戟教程实用的Storm Trident教程本教程以的的出色为基础。 流浪者的设置基于Taylor Goetz的。 Hazelcast状态代码基于wurstmeister的。 看看随附的。本教程的结构浏览Part * .java,了解Trident的基础知识使用...

    Spring Boot快速入门

    在这个快速入门教程中,我们将深入探讨Spring Boot的核心特性,并通过实际代码示例来理解其工作原理。 ### 一、Spring Boot的优势 1. **起步依赖(Starter Dependencies)**:Spring Boot通过起步依赖简化了Maven...

    Spring Boot教程程序样例

    这个教程程序样例涵盖了Spring Boot的核心特性以及与之相关的各种开发场景。让我们逐一探讨这些知识点: 1. **快速入门**:Spring Boot 的核心在于“约定优于配置”,通过自动配置和起步依赖(Starter POMs)来简化...

    545在线BLOG网.zip

    1. **Spring Boot基础知识**:学习Spring Boot,首先需要了解其核心特性,如自动配置、起步依赖、内嵌服务器等,以及如何创建第一个Spring Boot应用。 2. **RESTful API设计**:在线博客平台通常需要提供API接口供...

    精通 Spring Boot 42 讲

    7. **安全(Spring Security)**:Spring Boot默认集成了Spring Security,提供了基础的安全防护。 8. **数据访问**:对JPA、MyBatis等数据库访问技术有很好的支持,简化了数据库连接和操作。 9. **测试**:提供了...

    围绕 软件优雅设计规约,基于Spring Boot 的 Java Web 开发框架,帮助使用者开发更易于阅读维护的代.zip

    本教程将深入探讨如何结合软件优雅设计规约,利用Spring Boot构建高效的Java Web应用程序。 首先,我们需要理解“软件优雅设计规约”的核心理念。它主要包括以下几个方面: 1. **可读性**:代码应该像英文散文一样...

    spring-boot-1.2.6.RELEASE.zip

    - **教程与书籍**:众多在线教程、视频课程及专业书籍提供了深入学习的途径。 6. **升级与迁移** 随着Spring Boot不断迭代,开发者可能会考虑从1.2.6.RELEASE升级到更高版本。在升级过程中,需要注意API的变化、...

    J2EE技术学习路线

    首先,学习Java EE之前,你需要扎实的Java基础。这包括对Java语法、面向对象编程概念、异常处理、集合框架以及I/O流的深入理解。推荐书籍如《Head First Java》和《Effective Java》都是很好的入门资源。 一旦你...

    09.製造(Code).rar

    1. **Spring Boot基础** Spring Boot的核心理念是“约定优于配置”,它提供了大量的默认配置,使得开发者能够快速启动新项目。在学习Spring Boot时,你需要理解自动配置、起步依赖、嵌入式服务器等概念。例如,自动...

    SpringBoot-Learning-master.zip

    本资源包“SpringBoot-Learning-master”是针对Spring Boot初学者和进阶者的一份详尽教程,旨在帮助开发者快速掌握Spring Boot的核心特性和实践技巧。 1. **Spring Boot简介** Spring Boot是由Pivotal团队提供的...

    Java 服务器高级编程

    这个主题不仅包括了基础的Java EE(企业版)概念,还涉及到了高性能、高可用性、可伸缩性和安全性等方面。以下是一些核心的知识点: 1. **Java EE平台**:Java服务器高级编程首先会涉及Java EE平台,它是Java应用...

    Java 分布式应用程序设计代码

    它提供了事务管理、安全性和并发控制等企业级服务,使得开发人员可以专注于业务逻辑,而无需关心底层基础设施。 3. **JMS(Java Message Service)Java消息服务**:JMS提供了一种标准的方式来创建、发送、接收和...

    springboot:Spring Boot示例代码,课程和其他内容

    此外,可能还会有教程文档或课程资料,这些资料可能会讲解Spring Boot的基础概念、核心组件、最佳实践以及如何将Spring Boot与其他技术(如Docker、Cloud、Kubernetes等)集成。通过阅读和实践这些内容,开发者可以...

    Springboot-Advanced:springboot高级篇系列整合

    - **Hazelcast**:使用Hazelcast进行分布式缓存,适合大型分布式系统。 7. **消息队列** - **RabbitMQ**:Spring Boot与RabbitMQ集成,实现消息队列,提高系统异步处理能力。 - **Kafka**:集成Apache Kafka,...

    awesome-spring-boot:Spring启动资源

    - "spring":指的是Spring框架,它是Java企业级应用开发的基础,提供了强大的依赖注入、AOP、数据访问等功能。 - "spring-boot" / "springboot":Spring Boot是Spring框架的一个模块,简化了Java应用的初始设置和...

    springcloud学习笔记.docx

    4. **Spring Cloud Cluster**:提供了针对 ZooKeeper、Redis、Hazelcast、Consul 的选举算法和通用状态模式的实现,用于分布式环境下的服务协调。 5. **Spring Cloud Cloudfoundry**:支持与 Pivotal Cloud Foundry...

    SpringBoot:学习springboot

    在资料包中,你可能会找到关于SpringBoot与Mybatis整合的教程。Mybatis是一个轻量级的持久层框架,它简化了SQL操作,而SpringBoot提供了一种无缝集成Mybatis的方式。通过使用Mybatis-SpringBoot-starter,你可以轻松...

Global site tag (gtag.js) - Google Analytics