SpringBoot 配置 Redis 连接池

前言

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.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,请求高峰过去后,会先维持最大空闲连接一段时间,之后逐渐减少至最小空闲连接

  • 15
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot 配置 Redis 连接池可以通过以下步骤实现: 1. 在 pom.xml 文件中添加 Redis 相关依赖,例如: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> ``` 2. 在 application.properties 或 application.yml 文件中添加 Redis 相关配置,例如: ``` spring.redis.host=127...1 spring.redis.port=6379 spring.redis.password= spring.redis.database= spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1 spring.redis.pool.max-idle=8 spring.redis.pool.min-idle= ``` 其中,max-active 表示最大连接数,max-wait 表示最大等待时间,max-idle 表示最大空闲连接数,min-idle 表示最小空闲连接数。 3. 在代码中使用 RedisTemplate 或者 JedisPool 进行 Redis 操作,例如: ``` @Autowired private RedisTemplate<String, Object> redisTemplate; public void set(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object get(String key) { return redisTemplate.opsForValue().get(key); } ``` 或者: ``` @Autowired private JedisPool jedisPool; public void set(String key, String value) { try (Jedis jedis = jedisPool.getResource()) { jedis.set(key, value); } } public String get(String key) { try (Jedis jedis = jedisPool.getResource()) { return jedis.get(key); } } ``` 以上就是 Spring Boot 配置 Redis 连接池的基本步骤。 ### 回答2: Redis是一个开源的内存数据结构存储系统,它是被广泛应用于缓存、会话、排名等场景中的,springboot是一种轻量级的Java框架,通过springboot可以轻松快捷地搭建Java Web应用程序,它内置了大量的依赖库和插件,其中包括了对Redis的支持。在使用springboot配置Redis连接池时,最常用的组件是JedisPool。 JedisPool是Jedis的对象池实现,它在Jedis的基础上完成了连接池的实现,可以有效地降低Redis连接的创建和销毁的开销。在使用JedisPool时,需要考虑到Redis的部署方式和连接池配置参数。以下是配置Redis连接池的步骤: 1. 导入Redis和Jedis依赖包,可以在pom.xml文件中配置相关的依赖项。 2. 在application.yml或application.properties文件中配置Redis连接池的相关属性,例如: ```yaml spring: redis: host: localhost port: 6379 timeout: 2000 pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1 ``` 在这个例子中,我们配置Redis的主机地址、端口号、连接超时时间和连接池的相关参数。其中,max-active表示连接池中最多同时存在的活跃连接数,max-idle表示连接池中最多维护的空闲连接数,min-idle表示连接池中最少维护的空闲连接数,max-wait表示从连接池获取连接时的最长等待时间。 3. 创建JedisPool对象并将其注入到需要使用RedisSpring容器中。可以使用@Configuration注解创建一个配置类,用@Bean注解将JedisPool对象注入到Spring容器中。例如: ```java @Configuration public class RedisConfig { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private Integer port; @Value("${spring.redis.timeout}") private Integer timeout; @Bean public JedisPool jedisPool() { JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(8); jedisPoolConfig.setMinIdle(0); jedisPoolConfig.setMaxTotal(8); jedisPoolConfig.setMaxWaitMillis(-1); return new JedisPool(jedisPoolConfig, host, port, timeout); } } ``` 在这个例子中,我们使用@Configuration注解创建了一个RedisConfig配置类,在该类中使用@Bean注解创建了一个JedisPool对象,并将其注入到Spring容器中。在创建JedisPool对象时,我们使用JedisPoolConfig对象设置了连接池的相关参数,并在创建JedisPool对象时将其作为参数传递进去。 通过以上三个步骤,我们就可以成功地配置Redis连接池,然后就可以在Spring应用程序中通过注入JedisPool对象来使用Redis了。在使用JedisPool对象时,我们可以通过调用其getResource()方法获取Redis实例对象,然后通过该实例对象来进行缓存、读取等操作。 ### 回答3: Redis是一种流行的开源内存数据缓存系统,Spring Boot是一个开源框架,可以轻松创建独立的、生产级别的Spring基于Java的应用程序。在Spring Boot应用程序开发过程中,使用Redis缓存可以提高应用程序的性能和可扩展性。而在实现Redis连接池时,我们可以通过以下步骤来配置。 1. 添加将要用到的Redis依赖。在项目的pom.xml文件中,添加以下依赖项: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>${spring.boot.version}</version> </dependency> ``` 2. 在application.yaml中添加Redis配置。我们需要配置连接信息,包括host、port、password、database和pool等多个参数: ``` spring.redis.host=localhost spring.redis.port=6379 spring.redis.password= spring.redis.database=0 spring.redis.pool.max-active=8 spring.redis.pool.max-wait=-1ms spring.redis.pool.max-idle=8 spring.redis.pool.min-idle=2 ``` 其中,max-active表示池中最大连接数,max-wait表示当连接池中没有可用连接时,调用者要等待的最大时间,max-idle表示池中最大空闲连接数,min-idle表示池中最小空闲连接数。 3. 通过RedisTemplate连接Redis。我们可以在Java代码中通过RedisTemplate类来连接Redis,从而使用Redis缓存: ``` @Autowired private RedisTemplate<String,Object> redisTemplate; public void set(String key, Object value){ redisTemplate.opsForValue().set(key, value); } public Object get(String key){ return redisTemplate.opsForValue().get(key); } ``` 在这里,需要使用@Autowired来注入RedisTemplate,然后通过其opsForValue()方法来操作缓存。 通过以上步骤,我们就可以轻松地在Spring Boot应用程序中配置Redis连接池,从而实现高性能、可扩展的缓存系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值