IILeeのBlog

IILeeのBlog

SpringBoot2.x 整合 Redis 采坑记录

964
2019-09-29
SpringBoot2.x 整合 Redis 采坑记录

背景介绍

  • 公司最近的新项目在进行技术框架升级,基于的Spring Boot的版本是2.1.4,整合Redis数据库。网上基于2.X版本的整个Redis少之又少,中间踩了不少坑,特此把整合过程记录,以供小伙伴们参考。
  • 本文的基于在于会搭建Spring Boot项目的基础上进行的,入门是小白的话,请自行学习相关基础知识,网上或相关书籍很多。
  • 由于我本人对Maven比较熟悉,所以是以Maven进行的。Gradle类似,核心思想都是一样的,实现项目管理工具不同而已。

采坑记录

  • 这里先给出部分pom文件
        <!-- Spring Boot Redis依赖 -->
        <!-- 注意:1.5版本的依赖和2.0的依赖不一样,注意看哦 1.5我记得名字里面应该没有“data”, 2.0必须是“spring-boot-starter-data-redis” 这个才行-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <!-- 1.5的版本默认采用的连接池技术是jedis  2.0以上版本默认连接池是lettuce, 在这里采用jedis,所以需要排除lettuce的jar -->
            <exclusions>
                <exclusion>
                    <groupId>redis.clients</groupId>
                    <artifactId>jedis</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <!-- 添加jedis客户端 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

        <!--spring2.0集成redis所需common-pool2-->
        <!-- 必须加上,jedis依赖此  -->
        <!-- spring boot 2.0 的操作手册有标注 大家可以去看看 地址是:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.5.0</version>
        </dependency>

        <!-- 将作为Redis对象序列化器 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

注意pom文件中的注释。SpringBoots2.X以上版本默认连接池是lettuce,博主项目内redis使用的是集群,然后在dev环境中跑项目时,lettuce居然会解析出reids内网地址进行通信。虽然核心功能不受影响,但初次连接redis时速度极慢,而且会报出一大堆redis collection time out异常。最终博主跟踪reids连接解析源码发现它的连接池我我们常用的jedis不一致,这才找出了报错的源头。

后记

博主这是给出了解决方案,但为什么lettuce连接池会通过外网地址解析出内网ip博主无从而知,跟踪源码也没得出个所以然。如果有对lettuce熟悉的朋友欢迎联系博主进行指正。