添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
本文介绍了在高并发场景下使用Redis连接池的原因,如秒杀活动时减少网络连接开销。SpringBoot1.x默认使用Jedis连接池,而2.x则采用Lettuce。配置示例包括Jedis和Lettuce的连接池参数。Lettuce在处理集群时可能存在故障问题,解决方案是升级SpringBoot至2.3.0及以上并启用拓扑动态刷新。Lettuce优点在于其线程安全的连接实例,适合多线程环境。 摘要生成于 ,由 DeepSeek-R1 满血版支持,

连接池使用原因

在某些业务场景中使用了 redis 作为分布式缓存,在做业务活动的时候,比如秒杀活动,会一时间涌入大量的流量,这个时候和 redis server 进行网络连接的话就比较耗费资源和时间,直接影响接口的响应时间。

针对这种某一时刻的突发性流量,使用连接池是比较合适的。

ps:spring-boot-starter-redis默认是不使用连接池的

SpringBoot 1.x 默认采用 Jedis 作为 redis 客户端连接池
SpringBoot 2.x spring-data-redis 默认采用 Lettuce 作为 redis 客户端驱动连接池

spring-boot-starter-redis 1.4.7.RELEASE 是默认使用 jedis连接池 的最后一个版本

springboot1.4.7 之前的版本配置客户端连接池如下:

spring:
  redis:
    pool:
      maxActive: 5000
      maxIdle: 30
      minIdle: 5
      max-wait: 2000

1.4.7之后同时支持了jedislettuce两种连接池,配置方式也有点不同

Jedis

spring:
  redis:
    jedis:
      pool:
        maxActive: 5000				#最大连接数量
        maxIdle: 30					#最大闲置数量
        minIdle: 5					#最小闲置数量
        max-wait: 2000				#从连接池中获取连接的最大等待时间

Lettuce

spring:
  redis:
    lettuce:
      pool:
        maxActive: 5000					#最大连接数
        maxIdle: 30						#连接池最大空闲连接数.
        minIdle: 5						#连接池最小空闲连接数.
        max-wait: 2000					#从连接池中获取连接时的最大等待时间
        time-between-eviction-runs: 60s	#空闲对象逐出器线程的运行间隔时间.空闲连接线程释放周期时间.

ps:SpringBoot2.x开始默认使用的Redis客户端由Jedis变成了Lettuce,但是当Redis集群中某个节点挂掉之后,Lettuce将无法继续操作Redis,原因在于此时Lettuce使用的仍然是有问题的连接信息。

Lettuce支持redis 集群拓扑动态刷新,但是默认并没有开启,SpringBoot在集成Lettuce时默认也没有开启。并且在SpringBoot2.3.0之前,是没有配置项设置Lettuce自动刷新拓扑的。

解决方案:

升级到SpringBoot2.3.0或以上版本。并添加如下配置项

spring:
  redis:
    lettuce:
      cluster:
        refresh:
          adaptive: true		#拓扑动态感应即客户端能够根据 redis cluster 集群的变化,动态改变客户端的节点情况,完成故障转移。
          period: 60s			#刷新redis集群状态周期时间
    timeout: 60s				#连接redis的最大等待时间

在使用lettuce连接池时,创建连接工厂时依赖了commons-pool2,记得引入依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

Lettuce相较与jedis的优缺点

Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,在多线程环境下每个线程都去拿Jedis 实例,当连接数量增多时,物理连接成本就较高了,这个时候只有使用连接池为每个Jedis实例增加物理连接。

Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,因为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

一、Redisspring的整合一般分为spring-data-redis整合和JedisPool整合,先看看两者的区别1)、引用的依赖不同:spring-data-redis使用的依赖如下: <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data
随着数据量的日益增长,很多时候如果直接用SELECT * FROM XXX这些SQL语句来对上千万的数据进行查询,那耗费的时间可想而知。 作为用户一方,肯定希望系统响应越快越好,没什么人喜欢点一个按钮要等到吃完一顿饭回来还没能够响应成功,何况像我这些急性子的人,哈哈! 对Redis不了解的同学,可以自己先去查阅一下,网上有很多关于这方面的说法,我这里就不做阐述了。 在pom....
SpringBoot 中 Redis 的使用Redis@ConfigurationProperties 注解 Redis 通常在使用 redis 的时候,我需要导入 spring-boot-starter-data-redis 的依赖之外,我们还可以配置一个 redis连接池,减少创建连接与销毁连接的损耗 在 redis 的 Lettuce 配置类中 说可以允许导入 commons-pool2 来导入 redis连接池 以及配置连接相关参数 @ConfigurationProperties 注解
mysql开启批量执行sql参数allowMultiQueries与批处理 rewriteBatchedStatements=true(加速batchUpdate) CSDN-Ada助手: spark是一个大数据处理框架,python的对应实现是 pyspark, 是否使用过呢? 自定义springCloudLoadbalancer简述 CSDN-Ada助手: Java 技能树或许可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java mysql的binlog开启方式,查看方式.三种binlog模式介绍.以及使用binlog恢复数据.删除binlog weixin_44351477: 试了第二种方式可以,谢谢! datax和datax-web打包成docker运行 Lzhlzh594594: 打包报错 有现成的包吗 使用cron和mysqlDump定时备份和恢复mysql数据库,以及ubuntu无密码ssh登录 CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性。