前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring boot 与 内存数据库Hazelcast整合

spring boot 与 内存数据库Hazelcast整合

作者头像
kinbug [进阶者]
发布2019-08-08 09:55:36
1.4K0
发布2019-08-08 09:55:36
举报
文章被收录于专栏:IT进修之路IT进修之路

前言

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给出了使用实例。

整合配置:

代码语言:javascript
复制
@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数据变化的拦截器实现:

代码语言:javascript
复制
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数据变化的监听器实现:

代码语言:javascript
复制
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订阅接收消息:

代码语言:javascript
复制
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方法

代码语言:javascript
复制
//生产数据
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!");
    }
}
代码语言:javascript
复制
//消费数据
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:

代码语言:javascript
复制
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是集群的,数据可以在许多应用程序实例之间共享。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 用例
    • 整合配置:
      • map数据变化的拦截器实现:
        • map数据变化的监听器实现:
          • Topic订阅接收消息:
            • List和Queue的实例
            相关产品与服务
            对象存储
            对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档