Hazelcast入门指南第5部分

这是我撰写的有关Hazelcast的一系列文章的延续。 我强烈建议您阅读其他内容: 第1 部分第2 部分第3 部分第4部分

让人一见倾心的东西?

这篇文章中将没有Hazelcast专用代码。 让我重复一遍。 这篇文章中将没有Hazelcast专用代码。 这是因为Hazelcast的优秀人员生产的产品执行不同的标准。 这样可以选择客户。 Hazelcast实现的那些标准之一是内存缓存。

JCache呢?

JCache(JSR 107)仅用于Java。 Memcached协议客户端已跨多种语言实现,因此不能将其固定为一种语言。 在我看来,实施memcached协议是明智之举,因为它使Hazelcast不仅仅是“ Java东西”。

为什么要使用Hazelcast?

很好的问题! 如果可以使用任何内存缓存服务器,为什么要使用Hazelcast。 好吧,说实话,除非一台服务器在多台服务器之间共享数据库,否则一台甚至可能不需要缓存! 如果确实需要缓存解决方案,这就是为什么我会选择Hazelcast的原因:

  1. 自动实时备份–我没有读过至少一次没有备份过的一种Hazelcast数据类型。 只需站起来两个实例,一个实例从另一个实例中脱机,即可获得全部收益。
  2. 安全性–如果需要缓存的服务器位于不同的网络中,那么使用Hazelcast可以更轻松地制定防火墙规则。 假设有n台服务器需要缓存数据,其中n / 2台位于192.168.1.x网络上,而其他n / 2则在10.10.1.x网络上。 通过在任一网络上设置一个Hazelcast实例,所有n台计算机都可以共享一个缓存。 Hazelcast实例可以配置为仅与另一侧的实例进行对话。 这使防火墙规则编写器的工作更加容易,因为仅需为两个服务器而不是n台计算机制定一条规则,然后192.168.1.x机器就可以与其Hazelcast节点通信,而10.10.1.x机器就可以与其网络通信。 Hazelcast节点,并让Hazelcast实例完成其余工作。

我从不喜欢仅显示“嗡嗡”的示例,因此我将展示Java客户端如何与Python客户端共享数据。

设定

我正在使用Java 1.7和Python 3.4。 不幸的是,两种语言都没有开箱即用的内存缓存支持,所以我去寻找已经写好的客户端。

Java

我发现Spymemcached for Java。 我只是略述其能力的表面。 可以从Maven中获取。 这是项目的pom.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
  <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.darylmathison</groupId>
      <artifactId>Memcache</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>jar</packaging>
      <properties>
         <maven.compiler.source>1.7</maven.compiler.source>
         <maven.compiler.target>1.7</maven.compiler.target>
     </properties>
     <build>
             <plugin>
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>2.3.2</version>
                <configuration>
                     <showDeprecation>true</showDeprecation>
                 </configuration>
             </plugin>
             <plugin>
                <groupId>org.codehaus.mojo</groupId>
                 <artifactId>exec-maven-plugin</artifactId>
                 <version>1.3.2</version>
                 <executions>
                     <execution>
                         <goals>
                             <goal>java</goal>
                         </goals>
                     </execution>
                 </executions>
                 <configuration>
                     <mainClass>com.darylmathison.memcache.Main</mainClass>
                 </configuration>
             </plugin>
         </plugins>
     </build>
     <dependencies>
         <dependency>
             <groupId>net.spy</groupId>
             <artifactId>spymemcached</artifactId>
             <version>2.11.5</version>
         </dependency>
     </dependencies>
 </project><dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-servlet</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-metrics</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-swagger</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jackson</artifactId>
        </dependency>

Python

接下来,我找到了适用于Python的python3-memcached 。 它使用经典的setup.py过程进行安装。

服务器

如果服务器丢失,则没有太多的缓存。 人们可以在下载Hazelcast hazelcast.org/download根据自己的操作系统,内容,CD提取到的bin目录并运行server.bat或服务器脚本。 随着设置服务器的进行,这是我做过的最简单的事情。

情况

我试图使价格更便宜的“昂贵”操作是斐波那契数。 由于Python和Java都可以理解unicode,因此将值存储为unicode字符串。 密钥是一个unicode字符串,其中包含序列号或到达该序列所需的轮数。

Java

package com.darylmathison.memcache;

import java.io.IOException;
import java.net.InetSocketAddress;
import net.spy.memcached.MemcachedClient;

/**
 *
 * @author Daryl
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        try {
            MemcachedClient client = new MemcachedClient(new InetSocketAddress("localhost", 5701));
            for(int i = 2; i < 20; i++) {
                System.out.println("value of round " + i + " is " + fibonacci(i, client));
            }
            client.shutdown();
        } catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }
    
    private static long fibonacci(int rounds, MemcachedClient client) {
        String cached = (String)client.get(String.valueOf(rounds));
        if(cached != null) {
            System.out.print("cached ");
            return Long.parseLong(cached);
        }
        
        long[] lastTwo = new long[] {1, 1};
        
        for(int i = 0; i < rounds; i++) {
            long last = lastTwo[1];
            lastTwo[1] = lastTwo[0] + lastTwo[1];
            lastTwo[0] = last;
        }
        
        client.set(String.valueOf(rounds), 360, String.valueOf(lastTwo[1]));
        return lastTwo[1];
     }
}

Python

这是Python客户端。 作为一名pythonian,我尝试成为尽可能的pythonic。

import memcache

client = memcache.Client(['localhost:5701'])

def fibonacci(round):
    f = [1, 1, 1]
    
    for i in range(round):
        f[-1] = sum(f[:2])
        f[0], f[1] = f[1], f[2]
        
    return f[2]

def retrievefib(round):
    fib = client.get(str(round))
    if not fib:
        fib = fibonacci(round)
        client.set(str(round), str(fib))
    else:
        print("cached")
        
    return fib

def main():
    store = [ x for x in range(20) if x % 2 == 0]
    for i in store:
        retrievefib(i)
    
    for i in range(20):
        print(retrievefib(i))

if __name__ == "__main__":
    main()

结论

好吧,这是Hazelcast作为幕后力量的例子。 我认为这是最耀眼的地方。 无需创建全新的,巧妙的分布式应用程序即可利用Hazelcast。 所有要做的就是使用已知的做法,并让Hazelcast进行艰苦的工作。 这个岗位的来源,可以发现这里的Java代码,并在这里为Python代码。

参考文献

翻译自: https://www.javacodegeeks.com/2014/12/the-beginners-guide-to-hazelcast-part-5.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值