SpringBoot 配置 Redis 连接池

SpringBoot 配置 Redis 连接池SpringBoot2.0默认采用Lettuce客户端来连接Redis服务默认是不使用连接池的,只有配置redis.lettuce.pool下的属性的时候才可以使用到redis连接池

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

前言

SpringBoot2.0默认采用 Lettuce 客户端来连接 Redis 服务
默认是不使用连接池的,只有配置 redis.lettuce.pool下的属性的时候才可以使用到redis连接池

版本说明

  • spring-boot-starter-data-redis:2.5.4
  • redis6.2.5
  • commons-pool2:2.8.1
    采用 Lettuce 使用连接池,要依赖commons-pool2

pom 文件相关依赖

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

Jetbrains全家桶1年46,售后保障稳定

配置文件

  • 单机
spring:
  redis:
    host: 192.168.1.201
    port: 6379
    password: 123456
    timeout: 5000ms # 连接超时时间(毫秒)
    lettuce:
      pool:
        max-active: 20 # 连接池最大连接数(使用负值表示没有限制)
        max-idle: 10 # 连接池中的最大空闲连接
        min-idle: 5 # 连接池中的最小空闲连接
        max-wait: 5000ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
  • 集群
spring:
  redis:
    host: 192.168.1.26
    port: 7001
    password: 123456
    timeout: 5000ms # 连接超时时间(毫秒)
    cluster:
      nodes: 192.168.1.26:7001,192.168.1.26:7002,192.168.1.26:7003,192.168.1.26:7004,192.168.1.26:7005,192.168.1.26:7006
    lettuce:
      pool:
        max-active: 20 # 连接池最大连接数(使用负值表示没有限制)
        max-idle: 10 # 连接池中的最大空闲连接
        min-idle: 5 # 连接池中的最小空闲连接
        max-wait: 5000ms # 连接池最大阻塞等待时间(使用负值表示没有限制)

配置过程中产生的疑惑

问题1: 连接池是否生效?

这里我用两种方式分别验证了一下

  • 分析 RedisTempalte 源码
  • 向 redis 中存个十万条数据 如果连接池生效,那存入的速度应该会更快

分析 RedisTempalte 源码

从 redisTemplate.opsForValue().set(key, value); 直接开始
在这里插入图片描述
看 execute() 方法
在这里插入图片描述
看 RedisConnectionFactory
在这里插入图片描述
没有配置连接池时
在这里插入图片描述
配置连接池后
可以看到 clientConfiguration 多了 poolConfig 对象里面正是配置文件配置的相关参数
在这里插入图片描述

存数据测试速度

插入 1 W 条数据
配置了连接池 :
在这里插入图片描述
没配连接池 :
在这里插入图片描述
配置了连接池执行速度快了很多,连接池确实生效了

没有配置连接池并且 timeout 太小 还很容易发生连接超时异常,会在执行中报错
Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException

2 W 条数据没全部插入
在这里插入图片描述

问题2: 连接池生效的前提下, 最小空闲连接是 5 ,redis 客户端的连接数为什么还是 1 呢?

通过统计 redis 客户端的连接数发现项目启动后 redis 的连接数 + 1,如果说连接池配置生效的话,redis 的连接数 应该加连接池中的最小空闲连接数才对.

统计客户端连接数

lsof -i:6379 | awk -F '->' '{print $2}' | awk -F ':' '{print $1}' | awk '{sum[$1]+=1} END {for(k in sum) print k ":" sum[k]}' | sort -n -r -k 2 -t ':'

Lettuce 和 Jedis 的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例操作,是线程不安全的),除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问(即多个线程公用一个连接实例,线程安全),同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

在这里插入图片描述

经测试发现,基于 Lettuce 连接 redis, 开始会先创建一个连接实例,当一个实例不够用了才会去创建新的连接实例直到数量达到 max-active,请求高峰过去后,会先维持最大空闲连接一段时间,之后逐渐减少至最小空闲连接

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/231297.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Dependency Injection

    Dependency Injection

    2021年7月27日
    61
  • Oracle数据库数据恢复方法

    Oracle数据库数据恢复方法前一段遇到:操作系统崩溃,数据库留有所有数据文件,控制文件,配置文件。下面记录一下数据恢复过程。1.下载安装Oracle数据库。安装的数据库定要与之前版本的数据库版本一致。安装的数据库位置要与之前安装的数据库位置一致。2.创建新的数据库。创建新的数据库实例,实例名称密码要与之前数据库实例一致。3.打开sqlPlus命令行(1)输入命令system/密码assysdba。(2)shutdownimmediate;关闭数据库。4.使用原本的数据文件替换到新的数据

    2022年7月17日
    25
  • pycharm绘制图形_pycharm安装后无解释器

    pycharm绘制图形_pycharm安装后无解释器importnumpyasnpimportmatplotlib.pyplotaspltdefmain():#线的绘制x=np.linspace(-np.pi,np.pi,256,endpoint=True)c,s=np.cos(x),np.sin(x)#绘制plt.figure(1)#自变量…

    2022年8月28日
    8
  • Odin Inspector 系列教程 — Custom Value Drawer Attribute

    Odin Inspector 系列教程 — Custom Value Drawer AttributeCustomValueDrawerAttribute特性,允许用户自定义一个绘制方法,字段将以自定的绘制方式展示在Inspector中,非常灵活。含有Label和不含有Label的字段[CustomValueDrawer(“HaveLabelNameFunction”)]publicstringHaveLabelName;…

    2022年7月21日
    12
  • sd卡插拔

    sd卡插拔android/frameworks/base/core/java/android/os/storage/VolumeInfo.java:128:sEnvironmentToBroadcast.put(Environment.MEDIA_UNMOUNTED,Intent.ACTION_MEDIA_UNMOUNTED);android/frameworks/b…

    2022年5月30日
    103
  • Jlink-10 pin 的定义(stm32使用)官方定义

    Jlink-10 pin 的定义(stm32使用)官方定义因为在网上找了好久才找到正确的接法,所以专门记载了下来,因为stm32芯片这几个功能引脚会内置上拉电阻,所以不需要再外接电阻了。转载于:https://www.cnblogs.com/dzswise/p/7523420.html…

    2022年5月28日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号