SpringBoot系列之集成Redission入门与实践教程

Redisson是一款基于java开发的开源项目,提供了很多企业级实践,比如分布式锁、消息队列、异步执行等功能。本文基于Springboot2版本集成redisson-spring-boot-starter实现redisson的基本应用

软件环境:

  • JDK 1.8

  • SpringBoot 2.2.1

  • Maven 3.2+

  • Mysql 8.0.26

  • redisson-spring-boot-starter 3.15.6

  • 开发工具

    • IntelliJ IDEA

    • smartGit


项目搭建:

快速新建一个Spring Initializr项目,service url就选择这个https://start.aliyun.com,spring官网的url

在这里插入图片描述

选择jdk的版本,maven类型的项目

在这里插入图片描述

选择需要的依赖,选择之后,新生成的项目就会自动加上需要的maven配置,点击next生成一个SpringBoot的项目,不需要自己手工进行配置maven

在这里插入图片描述

这个里面没集成Redisson的starter,所以需要手工进行配置,需要注意一下redisson-spring-boot-starterSpringBoot对应的版本关系

在这里插入图片描述

pom.xml文件加上redisson-spring-boot-starter配置,然后reimport引入jar

 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.15.6</version>
</dependency>

对于Redisson的配置,有多种方式,可以使用json文件配置,也可以使用yaml文件配置,然后再引进来,如下,新建一个redisson.yml文件,加上单机版的配置

redisson.yml

singleServerConfig:idleConnectionTimeout: 10000connectTimeout: 10000timeout: 3000retryAttempts: 3retryInterval: 1500password: nullsubscriptionsPerConnection: 5clientName: nulladdress: "redis://127.0.0.1:6379"subscriptionConnectionMinimumIdleSize: 1subscriptionConnectionPoolSize: 50connectionMinimumIdleSize: 32connectionPoolSize: 64database: 0dnsMonitoringInterval: 5000
threads: 8
nettyThreads: 0
codec: !<org.redisson.codec.JsonJacksonCodec> {}
"transportMode":"NIO"

application.yml里引进redisson.yml

spring:redis:redisson:file: classpath:redisson.yml

另外一种方式是可以直接在application.yml里直接加上配置,这种方式可能对于使用了分布式配置中心管理的项目更加方便一些

spring:redis:redisson:config: |singleServerConfig:idleConnectionTimeout: 10000connectTimeout: 10000timeout: 3000retryAttempts: 3retryInterval: 1500password: nullsubscriptionsPerConnection: 5clientName: nulladdress: "redis://127.0.0.1:6379"subscriptionConnectionMinimumIdleSize: 1subscriptionConnectionPoolSize: 50connectionMinimumIdleSize: 32connectionPoolSize: 64database: 0dnsMonitoringInterval: 5000threads: 0nettyThreads: 0codec: !<org.redisson.codec.JsonJacksonCodec> {}transportMode: "NIO"

在项目中如果想要自己加上配置,创建一个redisson可以先创建一个Config对象,如何进行设置就可以

Config config = new Config();
config.useSingleServer().setAddress("redis://192.168.8.12
8:6379");
config.setCodec(new StringCodec());
return Redisson.create(config);

翻看redisson-spring-boot-starter的源码,也是创建Config,进行设置,这个starter为我们提供了自动配置功能,源码路径:org.redisson.spring.starter.RedissonAutoConfiguration#redisson

 public RedissonClient redisson() throws IOException {Config config = null;Method clusterMethod = ReflectionUtils.findMethod(RedisProperties.class, "getCluster");Method timeoutMethod = ReflectionUtils.findMethod(RedisProperties.class, "getTimeout");Object timeoutValue = ReflectionUtils.invokeMethod(timeoutMethod, redisProperties);int timeout;if(null == timeoutValue){timeout = 10000;}else if (!(timeoutValue instanceof Integer)) {Method millisMethod = ReflectionUtils.findMethod(timeoutValue.getClass(), "toMillis");timeout = ((Long) ReflectionUtils.invokeMethod(millisMethod, timeoutValue)).intValue();} else {timeout = (Integer)timeoutValue;}if (redissonProperties.getConfig() != null) {try {config = Config.fromYAML(redissonProperties.getConfig());} catch (IOException e) {try {config = Config.fromJSON(redissonProperties.getConfig());} catch (IOException e1) {throw new IllegalArgumentException("Can't parse config", e1);}}} else if (redissonProperties.getFile() != null) {try {InputStream is = getConfigStream();config = Config.fromYAML(is);} catch (IOException e) {// trying next formattry {InputStream is = getConfigStream();config = Config.fromJSON(is);} catch (IOException e1) {throw new IllegalArgumentException("Can't parse config", e1);}}} else if (redisProperties.getSentinel() != null) {Method nodesMethod = ReflectionUtils.findMethod(Sentinel.class, "getNodes");Object nodesValue = ReflectionUtils.invokeMethod(nodesMethod, redisProperties.getSentinel());String[] nodes;if (nodesValue instanceof String) {nodes = convert(Arrays.asList(((String)nodesValue).split(",")));} else {nodes = convert((List<String>)nodesValue);}config = new Config();config.useSentinelServers().setMasterName(redisProperties.getSentinel().getMaster()).addSentinelAddress(nodes).setDatabase(redisProperties.getDatabase()).setConnectTimeout(timeout).setPassword(redisProperties.getPassword());} else if (clusterMethod != null && ReflectionUtils.invokeMethod(clusterMethod, redisProperties) != null) {Object clusterObject = ReflectionUtils.invokeMethod(clusterMethod, redisProperties);Method nodesMethod = ReflectionUtils.findMethod(clusterObject.getClass(), "getNodes");List<String> nodesObject = (List) ReflectionUtils.invokeMethod(nodesMethod, clusterObject);String[] nodes = convert(nodesObject);config = new Config();config.useClusterServers().addNodeAddress(nodes).setConnectTimeout(timeout).setPassword(redisProperties.getPassword());} else {config = new Config();String prefix = REDIS_PROTOCOL_PREFIX;Method method = ReflectionUtils.findMethod(RedisProperties.class, "isSsl");if (method != null && (Boolean)ReflectionUtils.invokeMethod(method, redisProperties)) {prefix = REDISS_PROTOCOL_PREFIX;}config.useSingleServer().setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort()).setConnectTimeout(timeout).setDatabase(redisProperties.getDatabase()).setPassword(redisProperties.getPassword());}if (redissonAutoConfigurationCustomizers != null) {for (RedissonAutoConfigurationCustomizer customizer : redissonAutoConfigurationCustomizers) {customizer.customize(config);}}return Redisson.create(config);}

在项目中使用的话,一般直接用@Resource加一个RedissonClient即可,不需要自己创建了,下面给出使用Redisson API实现的共同关注的人和排名榜的简单例子

package com.example.redission;import org.assertj.core.util.Lists;
import org.junit.jupiter.api.Test;
import org.redisson.api.*;
import org.redisson.client.RedisClient;
import org.redisson.client.protocol.ScoredEntry;
import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.ExecutionException;
import java.util.stream.IntStream;@SpringBootTest
class SpringbootRedissionApplicationTests {@Resourceprivate RedissonClient redissonClient;@Testvoid contextLoads() throws ExecutionException, InterruptedException {// 共同关注的人RSet<Object> tom = redissonClient.getSet("tom");tom.addAll(Lists.newArrayList("令狐冲","james","风清扬"));RSet<Object> jack = redissonClient.getSet("jack");jack.addAll(Lists.newArrayList("令狐冲","tim","jack"));System.out.println("共同关注的人:"+tom.readIntersectionAsync("jack").get());// 排名榜RScoredSortedSet<String> school = redissonClient.getScoredSortedSet("school");school.add(60, "tom");school.add(60, "jack");school.add(60, "tim");school.addScore("tom", 20);school.addScore("jack", 10);school.addScore("tim", 30);RFuture<Collection<ScoredEntry<String>>> collectionRFuture = school.entryRangeReversedAsync(0, -1);Iterator<ScoredEntry<String>> iterator = collectionRFuture.get().iterator();System.out.println("成绩从高到低排序");while(iterator.hasNext()) {ScoredEntry<String> next = iterator.next();String value = next.getValue();System.out.println(value);}RFuture<Collection<ScoredEntry<String>>> collectionRFuture1 = school.entryRangeReversedAsync(0, 2);Iterator<ScoredEntry<String>> iterator1 = collectionRFuture1.get().iterator();System.out.println("成绩前三名");while (iterator1.hasNext()) {System.out.println(iterator1.next().getValue());}}}

附录

官网的Readme文档:https://github.com/redisson/redisson/blob/master/redisson-spring-boot-starter/README.md

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

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

相关文章

CATIA环境编辑器用不了时创建项目快捷方式

CATIA环境编辑器用不了时创建项目快捷方式 一、参考适用情况示例二、 解决步骤(一) 先正确放置winb_64部署包(二) 添加环境文件(三) 修改加入的环境文件(四) 复制本机CATIA快捷方式后重命名(五) 修改快捷方式目标的值 一、参考适用情况示例 二、 解决步骤 (一) 先正确放置winb…

一文掌握 Apache SkyWalking

Apache SkyWalking SkyWalking是一个开源可观测平台&#xff0c;用于收集、分析、聚合和可视化来自服务和云原生基础设施的数据。SkyWalking 提供了一种简单的方法来保持分布式系统的清晰视图&#xff0c;甚至跨云。它是一种现代APM&#xff0c;专为云原生、基于容器的分布式系…

几个月大的幼猫怎么喂?性价比高的幼猫主食罐头推荐

我这些年在经营宠物店的过程中发现&#xff0c;许多铲屎官在猫咪约2个月大时会选择带它们回家喂养。然而&#xff0c;他们可能不知道如何为这个阶段的幼猫提供适当的营养。实际上&#xff0c;幼猫所需的营养成分与成年猫相似&#xff0c;都是高蛋白、中高脂肪和低碳水。而且在这…

【JavaScript】window 对象、location 对象、navigator 对象和 history 对象

1. window 对象 BOM (Browser Object Model ) 是浏览器对象模型&#xff1a; window对象是一个全局对象&#xff0c;也可以说是JavaScript中的顶级对象像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的所有通过var定义在全…

AI+BI行业数字化转型研讨会 - 总结精华回顾

带您一起观看研讨会精彩内容回顾&#xff01; || 导语 AIBI行业数字化转型研讨会—引领未来&#xff0c;智慧转型 德昂信息技术(北京)有限公司于2023年10月26日成功举办了AIBI行业数字化转型研讨会。此次盛会汇聚了产业精英、企业领袖以及技术专家&#xff0c;共同探讨在快速…

pycharm pro v2023.2.4(Python开发)

PyCharm是一种Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;PyCharm提供了强大的功能&#xff0c;包括语法突出显示、智能代码完成、代码检查、自动重构和调试等特性&#xff0c;这些都可以帮助Python开发人员更加高效地编写代码。 PyCharm Pro是PyCharm的高级版…

性能测试怎么入门?一文7个知识点带你成功入门!

一、相关概念 1、性能测试相关&#xff1a;负载测试&#xff0c;性能测试&#xff0c;压力测试&#xff0c;稳定性测试&#xff0c;全链路测试等 2、性能指标&#xff1a;吞吐率&#xff0c;tps&#xff0c;并发用户数&#xff0c;吞吐量&#xff0c;响应时间等 二、性能测试…

word办公小技巧:方框打勾、上下标、横隔线、排序

Word文件制作过程中&#xff0c;需要了解一些可以提高效率的小技巧帮助我们能够更快的完成工作&#xff0c;今天分享四个提高效率的小技巧 技巧一&#xff1a;方框内打√ 想要在word文件中设置出方框内√&#xff0c;的效果&#xff0c;在word文件中输入&#xff1a; ☑&…

cortex-A7核IIC实验--采集温湿度传感器的值

1.IIC总线---同步串行半双工 1&#xff09;一根数据线SDA--PF15&#xff0c;一根时钟线SCL--PF14 2&#xff09;传输速率&#xff1a;低速&#xff1a;100K 中速&#xff1a;400K 全速&#xff1a;3.4M 3&#xff09;外接两个上拉电阻的作用&#xff1a;总线空闲状态时&am…

图神经网络(GNN)性能优化方案汇总,附37个配套算法模型和代码

图神经网络的表达能力对其性能和应用范围有着重要的影响&#xff0c;是GNN研究的核心问题和发展方向。增强表达能力是扩展GNN应用范围、提高性能的关键所在。 目前GNN的表达能力受特征表示和拓扑结构这两个因素的影响&#xff0c;其中GNN在学习和保持图拓扑方面的缺陷是限制表…

esxi 6.7下安装黑裙

esxi上创建一个黑裙系统的虚拟机&#xff0c;用来存资料 一、工具 硬件&#xff1a; 工控机&#xff1a;装有esxi6.7系统&#xff08;192.168.100.2&#xff09;&#xff0c;配置&#xff1a;3865U&#xff0c;16G内存&#xff0c;120Gmsata120sata硬盘&#xff0c;6个网口 主…

JavaEE-博客系统3(功能设计)

本部分内容为&#xff1a;实现登录功能&#xff1b;强制要求用户登录&#xff1b;实现显示用户信息&#xff1b;退出登录&#xff1b;发布博客 该部分的后端代码如下&#xff1a; Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Ser…

Harmony OS—UIAbility的使用

概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。一个应用可以有一个UIAbility&#xff0c;也可以有多个UIAbility&#xff0c;类似于Android 的 Activity&#xff0c…

微服务-grpc

微服务 一、微服务&#xff08;microservices&#xff09; 近几年,微服这个词闯入了我们的视线范围。在百度与谷歌中随便搜一搜也有几千万条的结果。那么&#xff0c;什么是微服务 呢&#xff1f;微服务的概念是怎么产生的呢&#xff1f; 我们就来了解一下Go语言与微服务的千丝…

ConcurrentHashMap 源码解析

目录 一. 前言 二. 源码解析 2.1. 类结构 2.2. 基本属性 2.3. 构造方法 2.4. 增加元素 2.4.1. initTable() 2.4.2. helpTransfer() 2.4.3. transfer() 2.4.4. treeifyBin() 2.4.5. addCount() 2.5. 获取元素 2.6. remove() & replace() 2.7. clear() 2.8. s…

Leetcode—2578.最小和分割【简单】

2023每日刷题&#xff08;二十三&#xff09; Leetcode—2578.最小和分割 实现代码 class Solution { public:int splitNum(int num) {vector<int> a;while(num) {a.push_back(num % 10);num / 10;}int n a.size();sort(a.begin(), a.begin() n);int num1 0;int num…

AI全栈大模型工程师(十九)Semantic Kernel

文章目录 Semantic KernelSK 的开发进展SK 的生态位SK 基础架构后记 Semantic Kernel 先比较下 Semantic Kernel 和 LangChain。 Semantic KernelLangChain出品公司微软LangChain AI支持语言Python、C#、Java、TypeScriptPython、TypeScript开源协议MITMIT被应用在Microsoft …

使用ffmpeg调用电脑自带的摄像头和扬声器录制音视频

1、打开cmd&#xff0c;执行chcp 65001,修改cmd的编码格式为utf8&#xff0c;避免乱码 2、执行指令ffmpeg -list_devices true -f dshow -i dummy,查看当前window的音频和视频名称 3、打开windows系统的"打开声音设置"–“麦克风隐私设置”–"允许应用访问你…

扫码看视频是怎么做出来的?二维码加入视频的做法

视频用二维码来展示的方法是什么样的呢&#xff1f;相信大家在日常工作和生活中都遇到过&#xff0c;扫描二维码来观看视频的情况&#xff0c;那么视频存入二维码的方法是什么样的呢&#xff1f;下面来给大家分享一下具体的操作技巧&#xff0c;通过简单的步骤就可以快速完成二…

C++ string赋值和添加值

在MFC中使用C的string&#xff0c;要先#include <string>&#xff0c;然后&#xff0c;std::string s2("") 这样就可以了&#xff1b; void CStrnewView::OnDraw(CDC* pDC) {CStrnewDoc* pDoc GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for n…