Spring集成hazelcast实现分布式缓存

1.Hazelcast介绍

Hazelcast是Hazelcast公司开源的一款分布式内存数据库产品,提供弹性可扩展、高性能的分布式内存计算。并通过提供诸如Map,Queue,ExecutorService,Lock和JCache等Java的许多开发人员友好的分布式实现。

Hazelcast优势

  • Hazelcast提供开源版本。

  • Hazelcast无需安装,只是个极小jar包。

  • Hazelcast提供开箱即用的分布式数据结构,如Map,Queue,MultiMap,Topic,Lock和Executor。

  • Hazelcast集群非传统主从关系,避免了单点故障;集群中所有成员共同分担集群功能。

  • Hazelcast集群提供弹性扩展,新成员在内存不足或负载过高时能动态加入集群。

  • Hazelcast集群中成员分担数据缓存的同时互相冗余备份其他成员数据,防止某成员离线后数据丢失。

  • Hazelcast提供SPI接口支持用户自定义分布式数据结构。

Hazelcast适用场景

  • 频繁读写数据

  • 需要高可用分布式缓存

  • 内存行NoSql存储

  • 分布式环境中弹性扩展

2.代码工程

pom.xml

 
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>hazelcast</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>com.hazelcast</groupId><artifactId>hazelcast-all</artifactId><version>4.0.2</version></dependency></dependencies></project>

hazelcast.xml

<hazelcastxsi:schemaLocation="http://www.hazelcast.com/schema/confighttp://www.hazelcast.com/schema/config/hazelcast-config-3.12.12.xsd"xmlns="http://www.hazelcast.com/schema/config"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><instance-name>XML_Hazelcast_Instance</instance-name><network><join><multicast enabled="false"></multicast><tcp-ip enabled="true"><member>10.11.68.77</member></tcp-ip></join></network>
</hazelcast>

application.yaml

 
server:port: 8090

entity

 
package com.et.hazelcast.entity;
import java.io.Serializable;
public class Employee implements Serializable{private static final long serialVersionUID = 1L;private int empId;private String name;private String department;public Employee(Integer id, String name, String department) {super();this.empId = id;this.name = name;this.department = department;}public int getEmpId() {return empId;}public void setEmpId(int empId) {this.empId = empId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDepartment() {return department;}public void setDepartment(String department) {this.department = department;}@Overridepublic String toString() {return "Employee [empId=" + empId + ", name=" + name + ", department=" + department + "]";}
}

controller

 
package com.et.hazelcast.controller;import com.et.hazelcast.entity.Employee;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;@Controller
public class HelloWorldController {@RequestMapping("/hello")@ResponseBodypublic Map<String, Object> showHelloWorld(){Map<String, Object> map = new HashMap<>();map.put("msg", "HelloWorld");return map;}@Cacheable(value = "employee")@GetMapping("employee/{id}")@ResponseBodypublic Employee getSubscriber(@PathVariable("id") int id) throwsInterruptedException {System.out.println("Finding employee information with id " + id + " ...");return new Employee(id, "John Smith", "CS");}
}

准备三个启动类

 
package com.et.hazelcast;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;@EnableCaching
@SpringBootApplication
public class HazelcastNode1Starter {public static void main(String[] args) {SpringApplication.run(HazelcastNode1Starter.class, args);}}
 
package com.et.hazelcast;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@EnableCaching
@SpringBootApplication
public class HazelcastNode2Starter {public static void main(String[] args) {SpringApplication.run(HazelcastNode2Starter.class, args);}
}
 
package com.et.hazelcast;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@EnableCaching
@SpringBootApplication
public class HazelcastNode3Starter {public static void main(String[] args) {SpringApplication.run(HazelcastNode3Starter.class, args);}
}

java代码客户端

这个代码中最关键的参数是需要设置之前定义的cluster-name “hazelcast-cluster”。 这样就实现了对hazelcast集群中map的调用。上述过程中,如果关闭任意一个hazelcast节点,上述缓存中的数据都可用。很好的实现了分布式。

 
package com.et.hazelcast;import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.core.HazelcastInstance;
import lombok.extern.slf4j.Slf4j;import java.util.Map;@Slf4j
public class HazelcastGetStartClient {public static void main(String[] args) {ClientConfig clientConfig = new ClientConfig();clientConfig.setClusterName("hazelcast-cluster");HazelcastInstance instance = HazelcastClient.newHazelcastClient(clientConfig);Map<Integer, String> clusterMap = instance.getMap("map");}}

代码仓库

  • https://github.com/Harries/springboot-demo

3.测试

  • 端口修改8088,启动HazelcastNode1Starter

  • 端口修改8089,启动HazelcastNode2Starter

  • 端口修改8090,启动HazelcastNode3Starter

 
Members {size:3, ver:5} [Member [10.11.68.77]:5701 - 2faf3b2d-76f3-493c-be48-d19d25aeb581 thisMember [10.11.68.77]:5702 - 63caca7f-f8ba-4b0a-989a-6e86a199fb72Member [10.11.68.77]:5703 - 3e9fa03c-72f4-4866-8904-73b908c4005d
]

浏览器输入http://localhost:8088/employee/6,存入数据到hazelcast里面,控制台输出

 
Finding employee information with id 6 ...

浏览器输入http://localhost:8089/employee/6,可以直接获取缓存数据,控制台不会打印日志出来 

浏览器输入http://localhost:8090/employee/6,可以直接获取缓存数据,控制台不会打印日志出来

4.引用

  • http://element-ui.cn/news/show-552564.html

  • http://www.liuhaihua.cn/archives/710310.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/753123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DM数据库(docker)

docker安装 安装必要的系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 配置阿里云Docker Yum源: yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 更新yum缓存 yum makecache fast 安装docker-CE: y…

微机二次消谐装置是怎样运行的

微机二次消谐装置是怎样运行的&#xff1f;微机二次消谐装置是一种用于电力系统中的无功补偿和谐波控制的装置&#xff0c;它采用先进的数字信号处理技术和微机控制技术&#xff0c;能够实现对电力系统中的无功功率和谐波进行快速有效的控制和补偿&#xff0c;以保证电力系统的…

Kotlin入门基础知识

前言 实践是最好的学习方式&#xff0c;技术也如此。 文章目录 前言1、安装 Java 和 Kotlin 环境2、程序基本结构3、数据类型1&#xff09;基本数据类型2&#xff09;布尔类型3&#xff09;字符类型4&#xff09;字符串类型 1、安装 Java 和 Kotlin 环境 2、程序基本结构 fun…

【JavaScript】变量的解构赋值

变量的解构赋值用途很多。 &#xff08;1&#xff09;交换变量的值 let x 1; let y 2;[x, y] [y, x];上面代码交换变量x和y的值&#xff0c;这样的写法不仅简洁&#xff0c;而且易读&#xff0c;语义非常清晰。 &#xff08;2&#xff09;从函数返回多个值 函数只能返回…

Issue 2046:Missing array size check in NewFixedArray

文章目录 环境搭建漏洞分析漏洞触发 漏洞利用总结参考 环境搭建 sudo apt install pythongit reset --hard 64cadfcf4a56c0b3b9d3b5cc00905483850d6559 export DEPOT_TOOLS_UPDATE0 gclient sync -D// debug version tools/dev/v8gen.py x64.debug ninja -C out.gn/x64.debug/…

备战蓝桥杯Day29 - 贪心-活动选择问题

问题描述 假设有n个活动&#xff0c;这些活动要占用同一片场地&#xff0c;而场地在某时刻只能供一个活动使用。 每个活动都有一个开始时间 si 和结束时间 fi (题目中时间以整数表示) ,表示活动在[si, f)区间占用场地。 问:安排哪些活动能够使该场地举办的活动的个数最多? 解…

FDA: 用于语义分割的傅里叶域自适应

论文链接&#xff1a;https://arxiv.org/abs/2004.05498 代码链接&#xff1a;GitHub - YanchaoYang/FDA: Fourier Domain Adaptation for Semantic Segmentation 机构&#xff1a;UCLA 发表于2020CVPR 这篇文章别的地方略读了&#xff0c;主要看看方法&#xff0c;感兴趣自…

【C语言】命令行参数;终止程序

终端命令行参数 On many systems, it is possible to pass arguments to main from a command line by including parameters int argc and char argv[] in the parameter list of main. Parameter argc receives the number of command-line arguments. Parameter argv is an …

如何理解“高频信息/高级语义”和“低频信息/低级语义”?

如何区分高频信息和低频信息&#xff1f; 如果一个东西是高度离散化和语义化的&#xff0c;一个字的差异也可能导致词语之间的含义发生重大变化&#xff0c;就是高频东西。例如一句话&#xff0c;如果你改变了一个单词&#xff0c;这个句子就会变成其他的意思。还有就是经过en…

部署高斯喷射项目gaussian-splatting

硬件要求 支持 CUDA 的 GPU&#xff0c;具有 7.0 的计算能力24 GB VRAM 软件要求 Conda用于 PyTorch 扩展的 C 编译器&#xff08;Visual Studio 2019&#xff09; CUDA SDK 11 for PyTorch 扩展&#xff0c;在 Visual Studio 之后安装C 编译器和 CUDA SDK 必须兼容 拉取源码 …

Poly Kernel Inception Network在遥感检测中的应用

摘要 https://export.arxiv.org/pdf/2403.06258 遥感图像&#xff08;RSI&#xff09;中的目标检测经常面临一些日益严重的挑战&#xff0c;包括目标尺度的巨大变化和多样的上下文环境。先前的方法试图通过扩大骨干网络的空间感受野来解决这些挑战&#xff0c;要么通过大核卷积…

.Net使用ElasticSearch

文章目录 前言主体内容一.Kibana中ElasticSearch的基础操作1.GET&#xff08;查询&#xff09;1.POST&#xff08;新增&#xff09;1.PUT&#xff08;修改&#xff09;1.DELET&#xff08;删除&#xff09; 二.在.Net中&#xff0c;对ElasticSearch进行基础操作1.DotNet连接Ela…

低代码与AI:构建面向未来的智能化应用

引言 在当今数字时代&#xff0c;技术的快速发展为各行各业带来了前所未有的机遇和挑战。企业和组织面临着如何迅速开发和交付高质量应用的需求&#xff0c;同时还需要应对日益复杂的业务需求和用户期望。在这样的背景下&#xff0c;低代码与人工智能&#xff08;AI&#xff0…

输送带的制造工艺

输送带的制造工艺 一、引言 输送带作为现代工业生产中不可或缺的物料运输工具&#xff0c;广泛应用于矿山、冶金、化工、电力、港口、粮食等各个行业。随着科技的发展&#xff0c;输送带的制造工艺也在不断进步&#xff0c;以满足日益增长的生产需求和运输效率。本文将详细介…

Python每日三道经典面试题(十三)

1.Python中的unittest是什么&#xff1f; unittest是Python内置的一个测试框架&#xff0c;也是Python标准库的一部分。它被设计用于支持自动化测试&#xff0c;包括单元测试、集成测试以及一些系统测试。unittest提供了丰富的测试构建、测试用例组织和测试运行功能&#xff0…

蓝桥杯可撤销并查集|查找|合并|撤销(C++)

前置知识 蓝桥杯并查集|路径压缩|合并优化|按秩合并|合根植物(C)-CSDN博客 可撤销并查集 关键注意 可撤销并查集的撤销功能如何实现可撤销并查集能不能用路径压缩 可撤销并查集(Reversible Union-Find)是一种扩展了标准并查集(Union-Find)数据结构的数据结构&#xff0c;它允…

高中数学:指数、对数、幂函数综合(拔高)

一、需要掌握的重要函数 1、第一组&#xff08;记住&#xff09; 例题 1、判断奇偶性 2、代值定象限 2、第二组&#xff08;记住&#xff09; 以下几个函数都是奇函数 3、常用知识点 1、找对称中心或对称轴 上加下减&#xff0c;左加右减 2、奇偶函数组合后的奇偶性 …

Excel数字签名技术总结

Excel数字签名 Excel数字签名【商业化】产品对比&#xff1a; Excel数字签名产品对比冰蓝科技GroupDocsconholdatemesciusaspose官网冰蓝科技 e-iceblue &#xff5c; 您的办公文档开发技术专家 &#xff5c; C#/VB.Net Excel, Word, PowerPoint, PDF, Barcode 组件Document …

京东获得JD商品详情 API

公共参数 名称类型必须描述keyString是免费申请调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…

python基础——对序列的通用操作【+和*以及in 和 切片操作】

&#x1f4dd;前言&#xff1a; 我们已经学习了python数据容器中的列表&#xff0c;元组以及字符串。而他们都属于序列 &#xff08;序列是指&#xff1a;内容连续&#xff0c;有序&#xff0c;可以用下标索引访问的数据容器&#xff09; 在之前已经介绍了不少操作方法&#xf…