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 cacheCfg = new CacheConfiguration();
cacheCfg.setName("myCache");
// 设置缓存过期时间
cacheCfg.setExpiryPolicyFactory(CreatedExpiryPolicy.factoryOf(Duration.ONE_MINUTE));
/**
* 缓存系统中的存储和获取是同步操作
* 在ignite集群中创建名称为simple的分布式缓存。第二次启动时,
* 名称为simple的缓存已经存在获取该缓存,把put语句注释掉仍然可以获取到值
*/
// 如果缓存不存在就创建,如果已存在就获取缓存
/* IgniteCache 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 simple =
ignite.getOrCreateCache("simple");
// 启动异步操作
@SuppressWarnings("deprecation")
IgniteCache asynCache = simple.withAsync();
// 原子操作 获取旧值 存入新值
asynCache.getAndPut(33, "3332");
// 获取上面调用的future
@SuppressWarnings("deprecation")
IgniteFuture fut = asynCache.future();
// 监听结果
fut.listen(f -> System.out.println("Previous cache value: " + f.get()));*/
/**
* 原子操作
*/
IgniteCache 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 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)静态集群配置:
服务端配置(如果多个节点集群可以用逗号分隔如
10.16.4.110:47500..47509
同时客户端也要进行相同配置,不能使用默认的组播方式,如果报异常请注意标有《注意此处》部分配置,对端自动传输类。
10.16.4.110:47500..47509
2)内存配置:
下面配置默认使用4G内存(应该自动使用堆外内存):
配置堆堆外内存要将持久化置为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瘦客户端模式,但还不支持异步。