Apache-Ignite学习和入门

1. 简介

Apache Ignite 内存数据组织框架是一个高性能、集成化和分布式的内存计算和事务平台,用于大规模的数据集处理,比传统的基于磁盘或闪存的技术具有更高的性能,同时他还为应用和不同的数据源之间提供高性能、分布式内存中数据组织管理的功能。具体介绍可参考官方中文教程

2. 安装

从 https://ignite.apache.org/download.cgi#binaries 下载最新的安装包,这里我下载的是 apache-ignite-fabric-2.4.0-bin.zip 包。下载后解压就可以直接使用了。

3. 运行

进入安装路径的bin目录,然后输入:ignite.sh即可启动ignite服务,输入几次就会启动几个集群节点。如下,我输入三次即启动了3个ignite集群节点。

 

下面是启动成功的界面:

其中: 

- servers=1 表示当前 Ignite 集群中只有一个节点。 

- clients=0 表示当前没有客户端连接到此集群。

图中红线框可以看到 servers=3,说明有2个新节点加入了集群。

4. 测试

1)用eclipse新建一个动态web项目,并导入相关包。项目结构如下:

2)建一个测试java类,代码如下:

package com.ignite.test;

import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.Ignition;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.lang.IgniteFuture;

public class SimpleCache {
	public static void main(String[] args){
		 
        // 以client的模式启动ignite, 数据存储到前面已经启动的ignite节点上 
        Ignition.setClientMode(true);
 
        try(Ignite ignite = Ignition.start()){
        	
        	// 缓存配置
            CacheConfiguration<Integer, String> cacheCfg = new CacheConfiguration<Integer, String>();
            cacheCfg.setName("myCache");
        	// 设置缓存过期时间
            cacheCfg.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_MINUTE));
        	
        	/**
        	 * 缓存系统中的存储和获取是同步操作
        	 * 在ignite集群中创建名称为simple的分布式缓存。第二次启动时,
        	 * 名称为simple的缓存已经存在获取该缓存,把put语句注释掉仍然可以获取到值
        	 */
            // 如果缓存不存在就创建,如果已存在就获取缓存 
           /* IgniteCache<Integer,String> cache = ignite.getOrCreateCache("simple");
            for(int i = 0; i < 10; i++){
                cache.put(i, i+"haha");
            }
            for(int i=0; i< 10; i++){
                System.out.println(cache.get(i));
            }*/
            
            /**
             * 异步操作
             */
            /*IgniteCache<Integer, String> simple =
                    ignite.getOrCreateCache("simple");
 
			// 启动异步操作 
			@SuppressWarnings("deprecation")
			IgniteCache<Integer, String>  asynCache = simple.withAsync();
			 
			// 原子操作 获取旧值 存入新值
			asynCache.getAndPut(33, "3332");
			 
			// 获取上面调用的future
			@SuppressWarnings("deprecation")
			IgniteFuture<Integer> fut = asynCache.future();
			// 监听结果 
			fut.listen(f -> System.out.println("Previous cache value: " + f.get()));*/
        	
        	/**
        	 * 原子操作
        	 */
        	IgniteCache<Integer, String> simple =ignite.getOrCreateCache("simple");
        	
 
			// 插入或更新  返回旧值 
			String oldVal = simple.getAndPut(11, "haha");
			 
			// 如果不存在则插入 返回旧值
			oldVal = simple.getAndPutIfAbsent(11, "11 getAndPutIfAbsent2");
			 
			// 如果存在则替换 返回旧值
			oldVal = simple.getAndReplace(11, "11 getAndReplace");
			 
			// 删除键值对 返回旧值
			oldVal = simple.getAndRemove(11);
			 
			// 如果不存在则插入 成功返回true
			boolean success = simple.putIfAbsent(12, "12 putIfAbsent");
			 
			// 如果存在则替换 成功返回 true
			success = simple.replace(12, "12 replace");
			 
			// 如果值匹配 则替换 成功返回true
			success = simple.replace(12, "12 replace", "12 12 12");
			 
			// 如果值匹配则删除 成功返回true
			success = simple.remove(11, "11");
        	
			//获取缓存数据并输出
			for(int i=0; i< 20; i++){
				if(simple.get(i)==null) {
					continue;
				}else {
					System.out.println(simple.get(i));
				}
            }
        }
    }
}

3)运行结果如下:

OK! 简单的一个项目就搞定了!

5. 单纯的从Ignite内存库中取数据

import com.alibaba.fastjson.JSON;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


    /**
     * Created by xudasong on 2018/4/23.
     * 获取高速缓存中的数据
     */
    public class GetDataTest {
        public static void main(String[] args) {

            try {

                Class.forName("org.apache.ignite.IgniteJdbcThinDriver");

                // Open JDBC connection  打开到集群节点的连接,监听地址可为本地(或其它服务器)
                Connection conn = DriverManager.getConnection("jdbc:ignite:thin://10.16.5.229/");

               // ResultSet rs = conn.createStatement().executeQuery("select * from GPSCACHE.GPSData");
                ResultSet rs = conn.createStatement().executeQuery("select * from person");
                Map<String, Object> map = new HashMap<>();
                //将ResultSet结果集转换成List
                List nameList=convertList(rs);
                //将List结果集存入map中
                map.put("peopleNames",nameList);
                //将map转换成Json格式
                String jsonString= JSON.toJSONString(map);
                System.out.println(jsonString);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
         
        //将ResultSet结果集转换成List方法定义
        private static List convertList(ResultSet rs) throws SQLException{
            List list = new ArrayList();
            ResultSetMetaData md = rs.getMetaData();//获取键名
            int columnCount = md.getColumnCount();//获取行的数量
            while (rs.next()) {
                Map rowData = new HashMap();//声明Map
                for (int i = 1; i <= columnCount; i++) {
                    rowData.put(md.getColumnName(i), rs.getObject(i));//获取键名及值
                    System.out.println(md.getColumnName(i)+' '+rs.getObject(i));
                }
                list.add(rowData);
            }
            return list;
        }
    }

6. Ignite内存数据库可视化工具

DBeaver作为一个示例,是一个针对开发者和数据库管理员的免费开源的统一数据库工具,它支持包括Ignite在内的所有常见数据库。 下载地址:https://dbeaver.jkiss.org/download/

Ignite有自己的JDBC驱动实现,DBeaver可以用其处理存储于分布式集群中的数据。

具体配置查看:https://www.zybuluo.com/liyuj/note/1023980

官方文档:https://www.zybuluo.com/liyuj/note/785629

可以参考的博文:Apache Ignite学习笔记:创建缓存、存储数据、读取缓存

7.关于Ignite相关配置需要注意的几点

1)静态集群配置:

服务端配置(如果多个节点集群可以用逗号分隔如<value>10.16.4.110,10.16.5.111</value>):

<property name="discoverySpi">
    <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
      <property name="ipFinder">
        <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
          <property name="addresses">
            <list>
             
              <!-- 
              IP Address and optional port range of a remote node.
              You can also optionally specify an individual port.
              -->
              <value>10.16.4.110:47500..47509</value>
            </list>
          </property>
        </bean>
      </property>
    </bean>
  </property>

同时客户端也要进行相同配置,不能使用默认的组播方式,如果报异常请注意标有《注意此处》部分配置,对端自动传输类。

<bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">        
        <property name="cacheConfiguration">
            <list>
                <!-- Partitioned cache example configuration (Atomic mode). -->
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="default"/>
                    <property name="atomicityMode" value="ATOMIC"/>
                    <property name="backups" value="1"/>
                </bean>
            </list>
        </property>
       <!-- 注意此处 -->
        <property name="peerClassLoadingEnabled" value="false"></property>

        <!-- Explicitly configure TCP discovery SPI to provide list of initial nodes. -->
        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
      <property name="ipFinder">
        <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
          <property name="addresses">
            <list>
             
              <!-- 
              IP Address and optional port range of a remote node.
              You can also optionally specify an individual port.
              -->
              <value>10.16.4.110:47500..47509</value>
            </list>
          </property>
        </bean>
      </property>
            </bean>
      </property>
    </bean>

2)内存配置:

下面配置默认使用4G内存(应该自动使用堆外内存):

<property name="dataStorageConfiguration">
	  <bean class="org.apache.ignite.configuration.DataStorageConfiguration">
		<!-- Redefining the default region's settings -->
		<property name="defaultDataRegionConfiguration">
		  <bean class="org.apache.ignite.configuration.DataRegionConfiguration">
			<property name="name" value="Default_Region"/>
            <property name="initialSize" value="#{100 * 1024 * 1024}"/>
			<!-- Setting the size of the default region to 4GB. -->
			<property name="maxSize" value="#{4L * 1024 * 1024 * 1024}"/>
            <property name="persistenceEnabled" value="false"/>
			<property name="pageEvictionMode" value="RANDOM_2_LRU"/>
		  </bean>
		</property>
	  </bean>
	</property>

配置堆堆外内存要将持久化置为false,另外在java运行参数中增加最大堆外内存分配大小(ignite.bat中),否则java默认的堆外内存太小(应该是64M):

if %ERRORLEVEL% equ 0 (
    if "%JVM_OPTS%" == "" set JVM_OPTS=-Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxPermSize=256m -XX:MaxDirectMemorySize=3g
) else (
    if "%JVM_OPTS%" == "" set JVM_OPTS=-Xms1g -Xmx1g -server -XX:+AggressiveOpts -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=3g
)

3)2.6版本开始支持java瘦客户端模式,但还不支持异步。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值