springboot(spring)整合redis(集群)、细节、底层配置讲解
创始人
2024-03-15 21:24:02

文章目录

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

一.springboot整合redis.

1.引入依赖.

         org.springframework.bootspring-boot-starter-data-redis

     其实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=1000spring.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.使用封装对象举例

 @Servicepublic class RedisService {@ResourceRedisTemplate template;                        ValueOperations string = template.opsForValue();HashOperations hash = template.opsForHash();ListOperations list = template.opsForList();SetOperations set = template.opsForSet();ZSetOperations 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.Testpublic 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即可,其他代码,配置都不用改.

        org.springframework.bootspring-boot-starter-data-redisio.lettucelettuce-coreredis.clientsjedis

三.补充原理.

      我们直接将操作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,未来不会太差,只要我们不要太懒就行, 咱们下期见.
在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...