原标题:SpringBoot整合Hazelcast实现分布式缓存

一. 分布式缓存代码实现步骤

1. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

2. 添加依赖包

com.hazelcast

hazelcast

com.hazelcast

hazelcast-spring

3. 创建application.yml配置文件

创建application.yml配置文件,可以在这里设置服务器端口号。

server:

port: 8081

4. 添加Hazelcast配置类

package com.yyg.boot.config;

import com.hazelcast.config.*;

import com.hazelcast.core.Hazelcast;

import com.hazelcast.core.HazelcastInstance;

import com.hazelcast.core.IMap;

import com.hazelcast.core.ITopic;

import com.yyg.boot.interceptor.IMapInterceptor;

import com.yyg.boot.interceptor.MapListener;

import com.yyg.boot.interceptor.TopicListener;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

* @Author 一一哥Sun

* @Date Created in 2020/4/23

* @Description Description

*/

@Configuration

public class HazelcastConfiguration {

@Bean

public Config hazelCastConfig() {

Config config = new Config();

//解决同网段下,不同库项目

GroupConfig gc=new GroupConfig("hazelGroup");

config.setInstanceName("hazelcast-instance")

.addMapConfig(new MapConfig()

.setName("configuration")

// Map中存储条目的最大值[0~Integer.MAX_VALUE]。默认值为0。

.setMaxSizeConfig(new MaxSizeConfig(200, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))

//数据释放策略[NONE|LRU|LFU]。这是Map作为缓存的一个参数,用于指定数据的回收算法。默认为NONE。LRU:“最近最少使用“策略。

.setEvictionPolicy(EvictionPolicy.LRU)

//数据留存时间[0~Integer.MAX_VALUE]。缓存相关参数,单位秒,默认为0。

.setTimeToLiveSeconds(-1))

.setGroupConfig(gc);

return config;

}

}

关于配置说明

eviction-policy

数据释放策略[NONE|LRU|LFU]。这是Map作为缓存的一个参数,用于指定数据的回收算法,默认为NONE。

NONE:当设置为NONE时,不会发生数据回收,同时max-size会失效。但是任然可以使用time-to-live-seconds和max-idle-seconds参数来控制数据留存时间。LRU:“最近最少使用“策略。LFU:“最不常用的使用”策略。

time-to-live-seconds(TTL)

数据留存时间[0~Integer.MAX_VALUE]。缓存相关参数,单位秒,默认为0。这个参数决定了一条数据在map中的停留时间。当数据在Map中留存超过这个时间并且没有被更新时,它会根据指定的回收策略从Map中移除。值为0时,意味着无求大。

4. 创建Controller接口方法

package com.yyg.boot.web;

import com.hazelcast.core.HazelcastInstance;

import com.hazelcast.core.IList;

import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.*;

import java.util.Map;

import java.util.Queue;

/**

* @Author 一一哥Sun

* @Date Created in 2020/4/23

* @Description Description

*/

@Slf4j

@RestController

@RequestMapping("/hazelcast")

public class HazelcastController {

@Autowired

private HazelcastInstance hazelcastInstance;

@PostMapping(value = "/save")

public String saveMapData(@RequestParam String key, @RequestParam String value) {

Map hazelcastMap = hazelcastInstance.getMap("hazelcastMap");

hazelcastMap.put(key, value);

return "success";

}

@GetMapping(value = "/get")

public String getMapData(@RequestParam String key) {

Map hazelcastMap = hazelcastInstance.getMap("hazelcastMap");

return hazelcastMap.get(key);

}

@GetMapping(value = "/all")

public Map readAllDataFromHazelcast() {

return hazelcastInstance.getMap("hazelcastMap");

}

@GetMapping(value = "/list")

public String saveList(@RequestParam(required = false) String value) {

// 创建集群List

IList clusterList = hazelcastInstance.getList("myList");

clusterList.add(value);

return "success";

}

@GetMapping(value = "/showList")

public IList showList() {

return hazelcastInstance.getList("myList");

}

@GetMapping(value = "/clearList")

public String clearList() {

IList clusterList = hazelcastInstance.getList("myList");

clusterList.clear();

return "success";

}

@GetMapping(value = "/queue")

public String saveQueue(@RequestParam String value) {

// 创建集群Queue

Queue clusterQueue = hazelcastInstance.getQueue("myQueue");

clusterQueue.offer(value);

return "success";

}

@GetMapping(value = "/showQueue")

public Queue showQueue() {

Queue clusterQueue = hazelcastInstance.getQueue("myQueue");

for (String obj : clusterQueue) {

log.warn("value=" + obj);

}

return clusterQueue;

}

@GetMapping(value = "/clearQueue")

public String clearQueue() {

Queue clusterQueue = hazelcastInstance.getQueue("myQueue");

clusterQueue.clear();

return "success";

}

}

5. 创建入口类

package com.yyg.boot;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

/**

* @Author 一一哥Sun

* @Date Created in 2020/4/23

* @Description Description

*/

@SpringBootApplication

public class HazelcastApplication {

public static void main(String[] args){

SpringApplication.run(HazelcastApplication.class,args);

}

}

6. 启动项目进行测试

6.1 启动集群

运行解析:

程序启动时,控制台会输出如下信息:

[hazelGroup] [3.12.6] Prefer IPv4 stack is true, prefer IPv6 addresses is false

2020-04-24 11:37:45.790 INFO 5820 --- com.hazelcast.instance.AddressPicker

[hazelGroup] [3.12.6] Picked [192.168.87.102]:5702, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5702], bind any local is true

这一段输出说明了当前 Hazelcast 的网络环境。首先是检测IPv4可用且检查到当前的IPv4地址是192.168.87.102。然后使用IPv6启用socket。在某些无法使用IPv6的环境上,需要强制指定使用IPv4,增加jvm启动参数:-Djava.net.preferIPv4Stack=true 即可。

[192.168.87.102]:5702 [hazelGroup] [3.12.6] Hazelcast 3.12.6 (20200130 - be02cc5) starting at [192.168.87.102]:5702

com.hazelcast.system : [192.168.87.102]:5702 [hazelGroup] [3.12.6] Copyright (c) 2008-2020, Hazelcast, Inc. All Rights Reserved.

这一段输出说明了当前实例的初始化端口号是5701。Hazelcast 默认使用5701端口。如果发现该端口被占用,会+1查看5702是否可用,如果还是不能用会继续向后探查直到5800。Hazelcast 默认使用5700到5800的端口,如果都无法使用会抛出启动异常。

我们先在8081端口上进行启动,在控制台会发现此时Members数量只有1,个,Hazelcast运行在5701端口上。

然后我们在8082端口上,再次启动第2个进程。此时在控制台,会发现Members数量变成了2个,意味着一个新的Hazelcast实例加入到了集群中。

Members[2]表示当前集群只有2个节点,2个节点都在ip为192.168.87.102的这台设备上,2个节点分别占据了5701端口和5702端口。端口后面的this说明这是当前节点,而未标记this的是其他接入集群的节点。

由此可见,Hazelcast实现集群非常的简单,会自动把不同进程添加到集群中。

6.2 测试map结构

我们先在8081端口的进程上存储一个数据到map中。

然后我们在8081上取数据,会发现数据已经获取到了。

然后我们在8082端口的进程上获取数据,发现同样也可以获取到之前存储的数据。说明在Hazelcast中只要在一个服务器节点上存储了数据,就可以自动实现从其他集群节点中获取到另一个节点中存储的数据。

6.3 测试list结构

我们先在8081端口的进程上存储一个数据到list中。

然后我们在8082上取数据,会发现数据已经获取到了。

同样的实现了集群数据共享。

6.4 测试queue结构

我们先在8081端口的进程上存储一个数据到queue中。

然后我们在8082上取数据,会发现数据已经获取到了。

同样的实现了集群数据共享。

7. 添加Hazelcast监听器配置

我们在上面的HazelcastConfiguration配置类中添加一些监听器类。

@Bean

public HazelcastInstance hazelcastInstance(Config config) {

HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(config);

//分布式map监听

IMap imap = hzInstance.getMap("hazelcastMap");

imap.addLocalEntryListener(new MapListener());

//拦截器(没写内容)

imap.addInterceptor(new IMapInterceptor());

//发布/订阅模式

ITopic topic = hzInstance.getTopic("hazelcastTopic");

topic.addMessageListener(new TopicListener());

return hzInstance;

}

此时完整的HazelcastConfiguration类代码为:

package com.yyg.boot.config;

import com.hazelcast.config.*;

import com.hazelcast.core.Hazelcast;

import com.hazelcast.core.HazelcastInstance;

import com.hazelcast.core.IMap;

import com.hazelcast.core.ITopic;

import com.yyg.boot.interceptor.IMapInterceptor;

import com.yyg.boot.interceptor.MapListener;

import com.yyg.boot.interceptor.TopicListener;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

* @Author 一一哥Sun

* @Date Created in 2020/4/23

* @Description Description

*/

@Configuration

public class HazelcastConfiguration {

@Bean

public Config hazelCastConfig() {

Config config = new Config();

//解决同网段下,不同库项目

GroupConfig gc=new GroupConfig("hazelGroup");

config.setInstanceName("hazelcast-instance")

.addMapConfig(new MapConfig()

.setName("configuration")

// Map中存储条目的最大值[0~Integer.MAX_VALUE]。默认值为0。

.setMaxSizeConfig(new MaxSizeConfig(200, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))

//数据释放策略[NONE|LRU|LFU]。这是Map作为缓存的一个参数,用于指定数据的回收算法。默认为NONE。LRU:“最近最少使用“策略。

.setEvictionPolicy(EvictionPolicy.LRU)

//数据留存时间[0~Integer.MAX_VALUE]。缓存相关参数,单位秒,默认为0。

.setTimeToLiveSeconds(-1))

.setGroupConfig(gc);

return config;

}

@Bean

public HazelcastInstance hazelcastInstance(Config config) {

HazelcastInstance hzInstance = Hazelcast.newHazelcastInstance(config);

//分布式map监听

IMap imap = hzInstance.getMap("hazelcastMap");

imap.addLocalEntryListener(new MapListener());

//拦截器(没写内容)

imap.addInterceptor(new IMapInterceptor());

//发布/订阅模式

ITopic topic = hzInstance.getTopic("hazelcastTopic");

topic.addMessageListener(new TopicListener());

return hzInstance;

}

}

8. 重新启动8081和8082进程测试

此时我们可以8081进程的map结构中添加一个新的key与value,如下所示:

然后在控制台可以看到我们之前Map结构的监听器类中,打印的log输出如下:

说明我们的IMap的拦截器生效了。而且8082进程中也获取到了存储的age值。

因为Hazelcast是集群的,数据可以在许多应用程序实例之间共享。

9. 完整项目结构

二. hazelcast管理终端

hazelcast其实提供了一个管理中心程序,可以帮助我们查看hazelcast中缓存的数据,当然这个管理中心可以不用安装,它只是帮我们查看缓存状态的一个工具而已。

1. 下载hazelcast管理中心

https://hazelcast.org/download/archives/#management-center

2. 解压之后,进入根目录进行启动。

3. 启动start.bat命令

4. 打开管理中心mancenter。

一开始会要求先注册一个管理员用户,密码需要8位以上,然后进行登录。

责任编辑:

hazelcast 搭建_SpringBoot整合Hazelcast实现分布式缓存相关推荐

  1. hazelcast 搭建_使用HazelCast实现Spring Config Server配置

    我们可以通过RabbitMQ将Spring Cloud Config服务器的发布配置设置用于MicroServices节点.这个解决方案的缺点: Spring Cloud Config仅支持GIT r ...

  2. springboot整合Hazelcast实现分布式缓存

    世上无难事,只要肯放弃 前言   菜鸡来记录一下学习分布式缓存的过程.   说起这个缓存我立马就想到了当初学习计算机组成原理的时候学过的什么寄存器,高速缓冲,内存,磁盘,一级缓存,二级缓存,三级缓存之 ...

  3. hazelcast 搭建_Spring Boot集成Hazelcast实现集群与分布式内存缓存

    Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展.高性能的分布式内存计算.并通过提供诸如Map,Queue,ExecutorService,Lock和JCach ...

  4. 分布式缓存Hazelcast详解及原理探究

    一. Hazelcast 1. Hazelcast简介 Hazelcast 是由Hazelcast公司开发的一款开源的分布式内存级别的缓存数据库,可以为基于JVM环境运行的各种应用提供分布式集群和分布 ...

  5. hazelcast java_JVM内存级分布式缓存Hazelcast

    Hazelcast是一个内存分布式计算平台,用于管理数据并并行执行执行应用程序. 1. 它是用Java编写的. 2. 与其他一些内存数据库(如redis)不同,Hazelcast是多线程的,这意味着可 ...

  6. java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

    一.缓存 当系统的并发量上来了,如果我们频繁地去访问数据库,那么会使数据库的压力不断增大,在高峰时甚至可以出现数据库崩溃的现象.所以一般我们会使用缓存来解决这个数据库并发访问问题,用户访问进来,会先从 ...

  7. hazelcast 搭建_hazelcast教程 入门

    hazelcast教程-入门 最近一直在研究hazelcast,被hazelcast简单的API操作和丰富的功能所震撼,但是困于中文文档的匮乏,所以想要编写一些关于hazelcast的一些教程文档,想 ...

  8. hazelcast 搭建_Hazelcast 集群功能及配置

    在前2篇博文中,介绍了 Hazelcast的基本原理 和 Hazelcast基本配置. 后续的博文会逐一介绍Hazelcast的主要功能组件.本篇将详细说明Hazelcast集群组建.集群数据通信相关 ...

  9. java 分布式 redis缓存技术_JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载...

    课程名称 JAVA架构师系列课程分布式缓存技术Redis权威指南,资源教程下载 课程目标 本课程从0基础开始,对redis的方方面面进行细粒度的讲解:包括基础操作.高级命令.各种集群模式.动态增减节点 ...

最新文章

  1. 【原】ASP.Net WebForm的发布(图解)
  2. SQL 2005单用户启动实例
  3. rabbitmq php 学习
  4. 一篇小的随笔,关于记忆算法和概念
  5. boost::ratio_sign相关的测试程序
  6. 现在为什么面对着人多,陌生人的时候会紧张?
  7. 关于获取oracle中数据变更的时间戳的探索(待更新)
  8. 基于arm-linux的防火墙设计,基于ARM9的Linux驱动开发及防火墙设计
  9. 纽约人寿CEO加入NYDIG董事会
  10. sap原因代码配置路径_使用Visual Studio Code编写和激活ABAP代码 (上)
  11. 蓝点中文Linux2.0 实验十三 进程与作业管理
  12. 如何用drawInRect()显示中文?
  13. 这些开源项目 yyds
  14. tcgames使用有延迟_心得分享:tcgames电脑玩刺激战场怎么用最流畅?
  15. Visual Studio Community 2017安装步骤(只装C++)
  16. unity设置手机横屏方法和相关问题
  17. 网站为什么要备案?网站备案流程是什么?
  18. iPhone 日历事件自动消失
  19. matlab井函数,用MATLAB函数解承压含水层完整井非稳定流问题
  20. 北大青鸟消防控制器组网_北大青鸟JBF-61S20防火门监控报警主机使用说明书

热门文章

  1. 【猿码】java swing实现喜羊羊与灰太狼推箱子游戏附带视频开发教程可做为Java毕设大作业
  2. hpgs2wnd.exe
  3. lwip --- (十六)TCP建立流程
  4. 蔡徐坤一条微博转发过亿 幕后推手被判刑五年
  5. js 中~~是什么意思?
  6. 认识计算机的桌面,电脑桌面的基础知识教程,教你认识电脑桌面
  7. Python中的if __name__ == ‘__main__‘什么意思?
  8. html5 sms短信发送_使用电子邮件免费向手机发送短信(SMS)
  9. 0.91寸 SSD1306 OLED介绍(四) --- 用上位机验证OLED显示屏
  10. ubuntu16.04 安装显卡驱动