文档章节

spring boot 与 内存数据库Hazelcast整合

KINBUG-BP
 KINBUG-BP
发布于 2019/08/07 15:09
字数 936
阅读 1.6K
收藏 20

前言

官网:https://hazelcast.org/

https://docs.hazelcast.org/docs/3.12.4/manual/html-single/index.html

spring boot 在此就不多做介绍了,想来大家对他应该都不陌生了

Hazelcast 可能大家就毕竟陌生了:

  • 简单易用
    Hazelcast是用Java编写的,没有其他依赖关系。只需简单的把jar包引入项目的classpath即可创建集群。
  • 无主从模式
    与许多NoSQL解决方案不同,Hazelcast节点是点对点的。没有主从关系; 所有成员都存储相同数量的数据,并进行相等的处理,避免了单点故障。
  • 弹性可扩展
    Hazelcast旨在扩展成千上万的成员。新成员启动,将自动发现群集,并线性增加存储和处理能力。成员之间通过TCP保持连接和通讯。
  • 读写快速高效
    Hazelcast所有数据都存储在内存中,提供基于内存快速高效的读写能力。

PS:另外就是——根据基准测试,Hazelcast在获取数据方面比Redis快56%,在设置数据方面比Redis快44%。 

用例

下面主要是讲讲springboot和Hazelcast的整合,并给出Hazelcast支持的数据类型MAP、List、Topic、Queue给出了使用实例。

整合配置:

@Configuration
public class HazelcastConfig {
	@Bean
	public Config config() {
		Config config = new Config();
		GroupConfig gc=new GroupConfig(Const.HAZELCAST_NAME);//解决同网段下,不同库项目
		
		config.setInstanceName("hazelcast-instance")
				.addMapConfig(new MapConfig().setName("configuration")
				.setMaxSizeConfig(new MaxSizeConfig(2000, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
				.setEvictionPolicy(EvictionPolicy.LRU).setTimeToLiveSeconds(-1))
				.setGroupConfig(gc);
		return config;
	}
	
	@Bean
	public HazelcastInstance hazelcastInstance(Config config) {
		HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(config); 
		//分布式map监听
		IMap<Object, Object> imap = hzInstance.getMap(Const.MAP_NAME);
		imap.addLocalEntryListener(new IMapListener());
		//拦截器(没写内容)
		imap.addInterceptor(new IMapInterceptor());
		//发布/订阅模式
		ITopic<String> topic = hzInstance.getTopic(Const.TOPIC_NAME); 
		topic.addMessageListener(new TopicListener());
		
		return hzInstance;
	}
}

map数据变化的拦截器实现:

public class IMapInterceptor implements MapInterceptor{

	private static final long serialVersionUID = 3556808830046436753L;

	@Override
	public Object interceptGet(Object value) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void afterGet(Object value) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Object interceptPut(Object oldValue, Object newValue) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void afterPut(Object value) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public Object interceptRemove(Object removedValue) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void afterRemove(Object oldValue) {
		// TODO Auto-generated method stub
		
	}
}

map数据变化的监听器实现:

public class IMapListener implements EntryAddedListener<String, String>{

	@Override
	public void entryAdded(EntryEvent<String, String> event) {
		// TODO Auto-generated method stub
		//干你监听的操作
		System.out.println("MAP分布式监听:"+event.getValue());
	}

}

Topic订阅接收消息:

public class TopicListener implements MessageListener<String> {
	
	@Override
	public void onMessage(Message<String> message) {
		String msg=message.getMessageObject();
		System.out.println("收到Topic消息:"+msg);
	}
}

List和Queue的实例

这两个我就没写在实际代码中,在test写了2个main方法

//生产数据
public class HazelcastGetStartServerMaster {
    public static void main(String[] args) {
        // 创建一个 hazelcastInstance实例
        HazelcastInstance instance = Hazelcast.newHazelcastInstance();
        // 创建集群Map
        IList<Object> clusterMap = instance.getList("myList");
        clusterMap.add("list0");
        clusterMap.add("list1");

        // 创建集群Queue
        Queue<String> clusterQueue = instance.getQueue("MyQueue");
        clusterQueue.offer("Hello hazelcast!");
        clusterQueue.offer("Hello hazelcast queue!");
    }
}
//消费数据
public class HazelcastGetStartServerSlave {
    public static void main(String[] args) {
        //创建一个 hazelcastInstance实例
        HazelcastInstance instance = Hazelcast.newHazelcastInstance();
        IList<Object> clusterList = instance.getList("myList");
        Queue<String> clusterQueue = instance.getQueue("MyQueue");
        
        System.out.println("Map Value:" + clusterList.get(1));
        System.out.println("Queue Size :" + clusterQueue.size());
        System.out.println("Queue Value 1:" + clusterQueue.poll());
        System.out.println("Queue Value 2:" + clusterQueue.poll());
        System.out.println("Queue Size :" + clusterQueue.size());
    }
}

这个时候启动项目显示如下:

当前只有一个节点,端口为:5701

这个时候写个main方法测试分布式map:

public class IMapTest {
	public static void main(String[] args) {
		Config config = new Config();
		GroupConfig gc=new GroupConfig(Const.HAZELCAST_NAME);
		config.setGroupConfig(gc);
		HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(config); 
		
		IMap<String, String> imap = hzInstance.getMap(Const.MAP_NAME);
		imap.put("myKey", "myObject");
    }
}

运行main方法发现原来启动的项目找那个Member变成了2个,因为main方法中也启动了一个Hazelcast实例加入了集群中。imap的拦截器,我监听器都生效了。并获取到了main方法中加的数据,因为Hazelcast是集群的,数据可以在许多应用程序实例之间共享。

© 著作权归作者所有

KINBUG-BP

KINBUG-BP

粉丝 63
博文 46
码字总数 48428
作品 3
成都
程序员
私信 提问
加载中

评论(6)

gitOpen_1
gitOpen_1
请问是点对点是指客户端需要同时连接多个数据库?在多节点数据一致性上的问题是怎么处理的
KINBUG-BP
KINBUG-BP 博主
点对点,是链接多个数据库...那点对多是什么? 多节点数据同步的问题,他本身就是分布式数据库,就跟你redis数据同步原理都是一样的,至于底层实现方式,建议你看看官方文档
gitOpen_1
gitOpen_1
文章中‘Hazelcast节点是点对点的。没有主从关系; 所有成员都存储相同数量的数据,并进行相等的处理,避免了单点故障。’
KINBUG-BP
KINBUG-BP 博主
对啊,你说的这些都没表达要连多个数据库啊
全栈程序狗
全栈程序狗
了解下ignite
KINBUG-BP
KINBUG-BP 博主
我了解啊,我知道他性能上要好些,但是使用不方便。而且和Hazelcast-jet一起用很强悍。
如何在Eureka中使用Hazelcast自动发现

Hazelcast IMDG supports auto-discovery for many different environments. Since we introduced the generic discovery SPI, a lot of plugins were developed so you can use Hazelcast s......

OSC知行合一
2019/10/11
75
0
Spring Boot 数据缓存 Cache

我们知道一个程序的瓶颈在于数据库,我们也知道内存的速度是大大快于硬盘的速度的。当我们需要重复地获取相同的数据的时候,我们一次又一次的请求数据库或者远程服务,导致大量的时间耗费在数...

xiaolyuh
2019/09/23
63
0
SpringBoot,用200行代码完成一个一二级分布式缓存

缓存系统的用来代替直接访问数据库,用来提升系统性能,减小数据库复杂。早期缓存跟系统在一个虚拟机里,这样内存访问,速度最快。 后来应用系统水平扩展,缓存作为一个独立系统存在,如red...

闲大赋
2017/02/27
8.4K
37
spring-boot JSR107缓存实战

这几天在开发的项目中,考虑引入一些缓存机制。顺便又了解了一下spring-boot的缓存、以及JSR107、ehcache。并做了一些使用实例。 spring-boot缓存使用实例 spring-boot中引入依赖,pom.xml: ...

填坑大人
2018/07/19
0
0
Java springcloud B2B2C o2o多用户商城 springcloud架构(十三)springboot集成spring cache

本文介绍如何在springboot中使用默认的spring cache, 声明式缓存 Spring 定义 CacheManager 和 Cache 接口用来统一不同的缓存技术。例如 JCache、 EhCache、 Hazelcast、 Guava、 Redis 等。...

itcloud
2019/03/19
38
0

没有更多内容

加载失败,请刷新页面

加载更多

四个步骤,学会单片机

有很多想学习单片机的朋友,但是不知道怎么入门,今天来讲讲我学习单片机的一些感受以及方法。由于单片机是一门要求动手的技术,所以,建议先确定所要学习单片机的型号,然后选用一块开发板,...

demyar
15分钟前
10
0
Nginx 配置获取用户真实IP

server { listen 80; server_name baidu.com; location / { if ($http_user_agent !~* (mobile|nokia|iphone|ipad|android|samsung......

牛A和牛C之间的我
17分钟前
5
0
Tower for Mac(强大的Git客户端) v4.3

Tower mac版是Macos上一款强大的Git客户端,具有强大的Git资源库管理、版本控制、分支管理等等,已被很多知名公司使用,并且能够和Xcode、GitHub、Beanstalk、BBEdit等软件无缝结合使用 . 功...

麦克W
17分钟前
9
0
Android知识体系总结2020之Android部分网路编程篇

1.计算机网络基础 计算机网络基础 2.网络数据解析 网路数据解析篇 3.Android网络编程 HttpClient和HttpURLConnection【比较过时,了解即可】 OkHttp Retrofit...

ClAndEllen
18分钟前
6
0
leaflet常用插件

1、常用地图切换加载(osm、google、baidu、gaode、tianditu.etc) https://github.com/htoooth/Leaflet.ChineseTmsProviders 2、切片地图加载(wmts)(支持矢量切片) https://github.com...

东东笔记
18分钟前
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部