前言

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>

配置文件

  • 单机
spring:redis:host: 192.168.1.201port: 6379password: 123456timeout: 5000ms # 连接超时时间(毫秒)lettuce:pool:max-active: 20 # 连接池最大连接数(使用负值表示没有限制)max-idle: 10 # 连接池中的最大空闲连接min-idle: 5 # 连接池中的最小空闲连接max-wait: 5000ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
  • 集群
spring:redis:host: 192.168.1.26port: 7001password: 123456timeout: 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:7006lettuce: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,请求高峰过去后,会先维持最大空闲连接一段时间,之后逐渐减少至最小空闲连接

SpringBoot 配置 Redis 连接池相关推荐

  1. SpringBoot配置druid连接池

    一.添加pom.xml <dependency><groupId>com.alibaba</groupId><artifactId>druid-spri ...

  2. springboot 配置德鲁伊连接池

    一.数据库连接池 1.1什么是数据库连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免 ...

  3. Springboot配置MongoDB连接池

    第一步:src/main/resources下新建配置文件application.properties #spring.data.mongodb是前缀,任意写 spring.data.mongodb. ...

  4. springboot引入Redis配置JedisPool连接池

    目录 一.pom.xml依赖 二.application.properties配置 三.java配置类 四.单元测试 一.pom.xml依赖 <dependency><groupId ...

  5. 配置springboot使用c3p0连接池

    为什么要使用c3p0? 使用springboot默认的数据源配置方式: spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: j ...

  6. redis专题:redis键值设计、性能优化以及redis连接池配置

    文章目录 1.redis键值设计 ①:key设计规范 ②:value设计规范 2. 命令使用优化 3. redis连接池配置参数设计 4. redis连接池预热 5. redis的key过期删除策略 ...

  7. Redis连接池配置详解

    连接池配置 文章目录 连接池配置 一.Redis连接池 二.jar包准备 三.编写代码配置,创建连接池,并调用处连接 总结 一.Redis连接池 与JDBC中在与数据库进行连接时耗时,从而需要引入连接 ...

  8. SpringBoot中数据连接池的配置(tomcat,HikariCP,dbcp2,druid)

    SpringBoot中数据连接池的配置(tomcat,HikariCP,dbcp2,druid) 文章目录 SpringBoot中数据连接池的配置(tomcat,HikariCP,dbcp2,drui ...

  9. Redis连接池Lettuce Jedis 区别

    Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. pring boot框架中已经集成了redis,在1.x.x的版本时默认使用的j ...

最新文章

  1. Spring 执行 sql 脚本(文件)
  2. (十) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录认证(1)
  3. 2022年跨境电商新玩法:Tik Tok私域流量沉淀+电商平台流量承接
  4. 设计模式之工厂模式(三)
  5. 如何实现点击微信内置浏览器返回按钮,返回指定页面,或者原地刷新
  6. 极客修回应“以次充好”报道:内部已经展开调查
  7. mfc搜索新建access字段_vs2010MFC中使用ODBC链接ACCESS数据库,怎样编写查找功能?...
  8. Bootstrap滚动监控器
  9. sphinx结合scws的mysql全文检索
  10. 一款免费的网络时间校准小程序
  11. word中插入emf,svg图像的注意事项
  12. 常用代码生成工具汇总(转)
  13. mysql中drop语法错误_MySQL DROP TABLE操作以及 DROP 大表时的注意事项
  14. win10计算机错误代码,win10电脑更新失败提示错误代码0x80070424修复方法
  15. iOS基础——通过案例学知识之LaunchScreen、APPIcon、StatusBar、UIScrollView、UIPageControl
  16. 罗振宇2017跨年演讲:我们这代人的机会在哪里?
  17. 推荐一个不错的国外html5模板网站
  18. SDH同步数字系列(Synchronous Digital Hierarchy,SDH)--SONET同步光网络(Synchronous Optical NETwork,SONET)
  19. UG NX二次开发(C#)-曲线-NXOpen.Curve初探
  20. Dell B1260dn Printer驱动的安装

热门文章

  1. 教程-利用壹伴插件一键采集图文
  2. 链脉智能名片如何精准化帮企业销售拓客
  3. 每日一题,每日一练。11车的可用捕获量(半夜两点在棋盘上左右横跳),
  4. 笔记:js:onfocus和onblur事件
  5. 查询至少选修了学生201215122选修的全部课程的学生号码
  6. python巧妙拼接图片
  7. Qt学习(四)---实例涂鸦画板mspaint
  8. 增强现实显示技术简介
  9. Spring: Spring依赖注入有哪几种方式?
  10. 室外gps+imu小车系列(一)——双天线gps话题的发布