springboot(spring)整合redis(集群)、细节、底层配置讲解

news2024/11/23 3:08:37

文章目录

    • 一.springboot整合redis.
      • 1.引入依赖.
      • 2.添加配置.
      • 3.使用封装对象举例
    • 二.细节讲解
      • 出现问题,堆外内存溢出
      • 解决方案,切换客户端
    • 三.补充原理.

一.springboot整合redis.

1.引入依赖.

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

     其实springboot整合其他主流框架直接在后面加上名称即可,比如spring-boot-starter-redis,然后就直接可以用,可以直接注入了.
     主要原因大概就是springboot框架已经包含了自动注入的功能,对于每一个引入的主要jar包(包含starter),都有一个factory的配置文件,里面配置了jar包的全路径,有了这个路径就可以将这些类处理然后注入到spring工厂中,我们就可以直接使用.

2.添加配置.

#地址
spring.redis.host=192.168.68.2
#端口
spring.redis.port=6379
#超时时间
spring.redis.timeout=60000
    

集群的话可以使用以下两个配置

 #以下是最关键的两个配置,
 #最大的切换连接节点的数目,当连接某一个节点不成功时,会去连接另一个节点
 spring.redis.cluster.max-redirects=1000
 spring.redis.cluster.nodes=192.168.5.111:6380,192.168.5.111:6381,192.168.5.111:6382,192.168.5.111:6383,192.168.5.111:6384,192.168.5.111:6385

3.使用封装对象举例

 @Service
  public class RedisService {
     @Resource
     RedisTemplate<String,String> template;                        

     ValueOperations<String, String> string = template.opsForValue();
     HashOperations<String, Object, Object> hash = template.opsForHash();
     ListOperations<String, String> list = template.opsForList();
     SetOperations<String, String> set = template.opsForSet();
     ZSetOperations<String, String> zset = template.opsForZSet();

    //封装String类型方法
    public void set(String key,String value){
        string.set(key,value);
    }
    public String get(String key){
        return string.get(key);
    }
    //封装hash方法
    public void hset(String key,String itemKey,String itemValue){
        hash.put(key,itemKey,itemValue);
     }
     public String hget(String key,String itemKey){
         return (String)hash.get(key,itemKey);
     }
  }
    -----测试-----
    @org.junit.Test
    public void TestRedisService(){
        redis.set("name","wang");
        redis.hset("hset","韩信","刺客");
        System.out.println(redis.get("name"));
        System.out.println(redis.hget("hset","韩信"));
    }

二.细节讲解

出现问题,堆外内存溢出

当我们的项目直接使用以上配置的时候,对项目进行压测,可能很快就出现堆外内存溢出.
在这里插入图片描述
     出现这个问题的原因就是lettuce操作netty的bug,在springboot2.0以后,默认使用lettuce作为操作redis的客户端.它使用netty进行网络通信,因为这个bug导致netty堆外内存溢出.
      假如我们的项目设置jvm最大内存为200m,那么netty如果没有指定堆外内存的话,就会默认使用我们这里的200m作为堆外内存的大小.同时这个堆外内存的使用并不会得到及时释放,将会不断增加.所以会出现堆外内存溢出.

解决方案,切换客户端

这里有两个解决方案:

  1. 升级lettuce客户端
  2. 切换客户端为jedis.

因为考虑到升级版本可能会带来其他的兼容问题,这里选择一种比较简单的方式,切换客户端为jedis.

切换方式:
直接修改pom即可,其他代码,配置都不用改.

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

三.补充原理.

      我们直接将操作redis的客户端由lettuce切换成jedis,但是使用的时候却不用做任何修改操作,
可以说非常方便,这是为什么呢?

      无论是lettuce还是jedis,都是操作redis的底层客户端, spring都对其进行了统一的封装,也就是封装成restTemplate. 从配置层面就可以看到这个关系.

      那怎么看底层的注入配置呢?其实springboot整合很多其他第三方组件,Redis,Mybatis,Elasticsearch等等都会有一个XXXAutoConifguration的配置类.直接搜索这个配置类即可.
在这里插入图片描述
在这里插入图片描述

这里我们主要看RedisAutoConfiguration.

在这里插入图片描述

而在对应的LettuceConnectionConfiguration和JedisConnectionConfiguration配置类中,都会向spring注入RedisConnectionFactory这个bean(在spring缺失这个bean的条件下)

在这里插入图片描述
在这里插入图片描述

      这样,即使底层切换了客户端,在使用层面也不需要做任何修改.是非常方便的.

      其实想一想如果我们自己去实现这个功能,你很有可能直接一套if else,没有jedis的话用lettuce,将来再新增一个其他的客户端,又增加个if else,这样是非常不美观,且不具有扩展性的,所以我们最重要的还是要学习这种思想,运用到我们自己的实际工作中.

今天的分享就到这里了,有问题可以在评论区留言,均会及时回复呀.
我是bling,未来不会太差,只要我们不要太懒就行, 咱们下期见.
在这里插入图片描述

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

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

相关文章

Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系解析

在我们日常的开发中&#xff0c;我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做&#xff0c;Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下&#xff0c;二者的区别和联系。希望给大家进行选择的时候&#xff0c;提供一些帮助…

DSP/BIOS的基本介绍

DSP/BIOS的基本介绍 DSP/BIOS是一个简易的实时嵌入式操作系统&#xff0c;主要面向实时调度与同步、主机/目标系统通信&#xff0c;以及实时监测等应用&#xff0c;具有实时操作系统的诸多功能&#xff0c;如任务的调度管理、任务间的同步和通信、内存管理、实时时钟管理、中断…

(十)再探反向传播和神经网络优化

文章目录1.背景介绍2.神经网络的模型3.神经网络中的参数更新初探3.1随机查找取最优3.2局部随机查找参数更新3.3 沿着梯度反方向更新4.链式法则与反向传播5.梯度方向的参数更新策略6.学习率退火6.1学习率衰减策略基础6.2 二阶优化方法6.3自适应学习率方法参考资料欢迎访问个人网…

Java基础之接口与抽象类区别

Java基础之接口与抽象类区别一、Java基础之接口与抽象类二、抽象类和最终类三、Java移位运算符四、局部变量为什么要初始化一、Java基础之接口与抽象类 一个子类只能继承一个抽象类, 但能实现多个接口抽象类可以有构造方法, 接口没有构造方法抽象类可以有普通成员变量, 接口没…

minikube helm 安装 jenkins

文章目录1. 准备条件2. 安装 helm3. 部署 jenkins3.1 创建 namespace jenkins3.2 创建存储卷 jenkins-volume3.3 创建 service account & RBAC3.4 定制 jenkins-values.yml3.5 安装 jenkins3.6 登陆 jenkins“Jenkins是一个著名的可扩展开源 CI/CD 工具&#xff0c;用于自动…

手写数字识别Mnist数据集和读取代码分享

数据集下载 链接&#xff1a; https://pan.baidu.com/s/1qpzrSFhmyrdGmbSScN_ZXg?pwdd1ws 提取码&#xff1a;d1ws 数据集读取 from pathlib import Path import requests ​ DATA_PATH Path("data") PATH DATA_PATH / "mnist" ​ PATH.mkdir(parent…

Android Navigation基本使用

目录1. Navigation概述2. Navigation组成3. 设置环境4. 使用方法4.1. 创建导航图4.1.1. 具体操作4.2. 向Activity添加NavHost4.2.1. 通过 XML 添加4.2.2. 使用布局编辑器添加4.3. 在导航图中创建目的地4.3.1. 具体操作4.4. 连接目的地4.4.1. 具体操作4.5. 目的地之间的导航4.5.…

认识3dmax 对象属性对话框

可以从右键或编辑菜单访问此对话框&#xff1b; 在此可以查看和编辑参数&#xff0c;以确定选定对象在视口和渲染过程中的行为&#xff1b; 包含3个面板&#xff1a;常规&#xff0c;高级照明&#xff0c;用户定义&#xff1b; 常规面板包含6个组&#xff1a;对象信息&#x…

[附源码]计算机毕业设计校园疫情管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

三、Git本地仓库基本操作——git仓库忽略跟踪文件

1. .gitignore文件 在工作区中的文件内容&#xff0c;很多时候我们基本只关注源文件。所以&#xff0c;肯定有些文件是不想使用git去管理的&#xff0c;比如&#xff1a; 编译生成的中间文件相关的IDE工程文件&#xff08;当然也可以进行git管理&#xff09;一些固定内容的说…

国外打工人分享如何如何通过销售excel电子表格赚到 28 万美元

在不到 2 年的时间里,这是我在 Etsy 上销售电子表格模板(Google 表格 + Excel)的收入。 而且我无论如何都不是电子表格专家。 但我确实知道如何找到有需求的数字产品,并且会帮助人们在通常需要更长时间才能完成的事情上节省时间。 我还没有看到很多人谈论这个,所以我想…

【图像分类损失】Encouraging Loss:一个反直觉的分类损失

论文题目&#xff1a;《Well-classified Examples are Underestimated in Classification with Deep Neural Networks》 论文地址&#xff1a;https://arxiv.org/pdf/2110.06537.pdf 1.背景 深度分类模型背后的一般常识是专注于分类错误的样本&#xff0c;而忽略远离决策边界的…

Studio 3T工具下载安装及使用教程

一、下载安装 官方网址&#xff1a;The Professional Client, IDE and GUI for MongoDB | Studio 3T 二、使用教程 CRUD操作&#xff1a; 打开命令行窗口&#xff0c;Open intelliShell 插入一个文档&#xff0c;db.collection.insertOne() 插入多个文档&#xff0c;db.coll…

[附源码]计算机毕业设计springboot中小学课后延时服务管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

PS画布基本操作 新建保存 图片类型区分设置

观看本文需要您的电脑装配有ps软件 如果没有 可以查看我的文章 PS软件下载安装以基本配置 然后我们打开ps软件 然后点击右上角 文件 然后选择 新建 然后可以配置一下 右边的话 我们可以设置 高度 和 宽度 都是数值 其次是要指定你这个数值的单位 一般情况下 都会用像素 一…

Vue(第十五课)Pinia组件库的基本知识

为什么要使用 Pinia&#xff1f; Pinia 是 Vue 的存储库&#xff0c;它允许您跨组件/页面共享状态。 如果您熟悉 Composition API&#xff0c;您可能会认为您已经可以通过一个简单的 export const state reactive({}). 这对于单页应用程序来说是正确的&#xff0c;但如果它是…

jsp人力资源管理系统Myeclipse开发mysql数据库servlet开发java编程计算机网页项目

一、源码特点 JSP 人力资源管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用serlvetdaobean mvc 模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5…

用户信息列表实现增删改查案例的实现【问题及解决过程记录】【综合案例】

目录 用户信息列表展示案例 1. 需求&#xff1a; 1. 简单功能 1. 列表查询 2. 登录 3. 添加 4. 删除 5. 修改 2. 复杂功能 1. 删除选中 2. 分页查询 * 好处&#xff1a; 1. 减轻服务器内存的开销 …

【云原生 | Kubernetes 实战】06、Pod高级实战:基于污点、容忍度、亲和性的多种调度策略(下)

目录 一、Pod节点亲和性 1.1 案例演示&#xff1a;pod 节点亲和性——podAffinity 1.2 案例演示&#xff1a;pod 节点反亲和性——podAntiAffinity 1.3 案例演示&#xff1a; 换一个 topologykey 值 二、污点和容忍度 2.1 案例演示&#xff1a; 把 node2 当成是生产环境专…

Python中常见的调色板: 颜色 color

Python中常见的调色板&#xff1a; 颜色 color 这个人对颜色的总结&#xff0c;非常到位哈&#xff01; https://blog.csdn.net/weixin_42943114/article/details/81811556