3分钟搞定is
在Spring Boot应用中集成Redis,我们可以按照以下步骤轻松实现。源码原理首先,详解确保在`pom.xml`文件中添加相关的连s连Spring Boot Starter依赖,以及Spring Boot对Redis的接池解析接池buffer源码支持,但需排除默认的源码原理`jedis`包并引入`lettuce`替代,以确保兼容性。详解代码如下:
org.springframework.boot
spring-boot-starter-data-redis
redis.clients
jedis
io.lettuce
lettuce-core
redis.clients
jedis
org.apache.commons
commons-pool2
2.5.0
接下来,连s连配置Redis连接池参数,接池解析接池包括主机名、源码原理端口、详解密码、连s连超时时间、接池解析接池最大连接数等。源码原理这些配置可以在`RedisConfig`类中通过`@Value`注解从`***.properties`文件中获取:
@Configuration
@PropertySource("classpath:***.properties")
public class RedisConfig {
// ...省略配置代码...
}
确保`RedisTemplate`实例化时设置正确的序列化器,并开启事务支持,以处理对象的存储和读取。最后,可以创建一个`RedisUtil`类来简化与Redis的交互:
@Bean
public RedisUtil redisUtil(RedisTemplate redisTemplate) {
RedisUtil redisUtil = new RedisUtil();
redisUtil.setRedisTemplate(redisTemplate);
return redisUtil;
}
这样,你就能在3分钟内完成Spring Boot应用与Redis的集成,并配置好必要的五一操盘指标源码连接池参数。
分析SpringBoot 的Redis源码
在Spring Boot 2.X版本中,官方简化了项目配置,如无需编写繁琐的web.xml和相关XML文件,只需在pom.xml中引入如spring-boot-starter-data-redis的starter包即可完成大部分工作,这极大地提高了开发效率。
深入理解其原理,我们研究了spring-boot-autoconfigure和spring-boot-starter-data-redis的源码。首先,配置项在application.properties中的设置会被自动映射到名为RedisProperties的类中,此类由RedisAutoConfiguration类负责扫描和配置。该类会检测是否存在RedisOperations接口的实现,例如官方支持的Jedis或Lettuce,以此来决定使用哪个客户端。
在RedisAutoConfiguration中,通过@Bean注解,它引入了LettuceConnectionConfiguration和JedisConnectionConfiguration,这两个配置类会创建RedisConnectionFactory实例。在注入RedisTemplate时,实际使用的会是第一个被扫描到的RedisConnectionFactory,这里通常是LettuceConnectionFactory,因为它们在@Import注解的水晶源码是什么导入顺序中位于前面。
自定义starter时,可以模仿官方starter的结构,首先引入spring-boot-autoconfigure,然后创建自己的配置类(如MyRedisProperties)和操作模板类(如JedisTemplete)。在MyRedisAutoConfiguration中,你需要编写相关配置并确保在spring.factories文件中注册,以便Spring Boot在启动时扫描到你的自定义配置。
以自定义my-redis-starter为例,项目结构包括引入的依赖,配置类的属性绑定,以及创建连接池和操作方法的实现。测试时,只需在Spring Boot项目中引入自定义starter,配置好相关参数,即可验证自定义starter的正确工作。
Jedis连接池究竟是何物?
连接池是管理并回收资源的对象集合,以减少系统资源的创建和销毁开销,提升系统吞吐量,适用于创建/销毁资源耗时的场景。以Jedis为例,其底层使用的新骆驼tv源码是GenericObjectPool作为连接池实现。业务从空闲连接队列获取连接,最长等待时间由maxWaitMillis决定。获取后,检查是否有效,关闭后再次放入空闲队列或销毁。连接池的参数如配置文件中详细列出,Spring-Data-Redis将参数进行收敛,用户主要配置参数较少,关键参数包括验证方法的启用和关闭。Jedis实例通过Spring-Data-Redis封装后,实现对连接池的管理,提供了BorrowObject方法获取连接和ReturnObject方法归还连接。其中BorrowObject方法可能从空闲队列获取或创建新连接,超过最大等待时间则抛出异常。ReturnObject方法负责归还连接并进行有效性验证。连接池还包括定期驱逐/保活机制、检查机制和抛弃机制,通过配置参数、源码分析和JMX工具实现连接状态监控和问题排查。了解连接池原理有助于提升资源管理效率,并在实际应用中根据业务需求优化配置。蓝冠源码网
带Lettuce连接池、多数据源配置的RedisTemplate方案
在实际项目开发中,处理多数据源的Redis需求需要一个定制化的解决方案。每个独立的Redis数据源都会配置自己的连接池,确保高效和隔离。以下是实现这一功能的关键步骤:
首先,设计配置时要考虑到不同的Redis模式,包括单机、集群和哨兵模式。虽然我们已完成了单机模式的测试,其他模式的测试环境尚未准备。
配置文件结构包括连接地址、端口、部署模式(如:1-单机,2-集群,3-哨兵)、用户名、密码、分片号(仅对集群模式)和哨兵主节点信息等。Spring Boot通过@ConfigurationProperties注解从application.properties文件加载配置,如以"redis-pool"为前缀的配置项。
例如,application.properties中配置了RedisPoolConfig,数组中的第0个配置项,其maxActive、maxIdle、minIdle和连接超时时间等参数都被设置。配置完成后,Spring Boot需按照依赖顺序启动,确保RedisPoolConfig在RedisPool的初始化之前加载。
使用Lettuce的线程安全客户端,配置包括MASTER和REPLICA节点信息,适用于Sentinel模式。对于Cluster模式,配置涉及重定向限制。在单机模式下,我们创建工具类封装RedisTemplate,通过索引确定配置。
测试代码中,我们启动多线程同时长连接读取Redis,配置中maxActive和maxIdle设置为,理论上会增加个连接。在测试前、中、后,通过info clients命令检查连接数,可以看到连接池配置确实生效,连接数在测试过程中有所增加,然后在测试结束时恢复。
完整代码可在GitHub上查看:github.com/f/R...
Jedis 连接池 详解
JedisPool 的参数配置详解 1. maxTotal maxTotal 控制连接池中最多构建的 Jedis 实例数量。在尝试获取资源时,如果超过此限制,线程将阻塞,直到资源可用。一旦超过最大等待时间,maxWaitMillis,线程将抛出异常。 例如:打印结果展示了最多只能拿到 2 个实例,调用 getResource 时会阻塞线程。在 main 线程堆栈中,可以看到阻塞的原因是 Jedis 底层调用了 LockSupport 的 park 方法。如果 maxTotal 设置得过小,可能会增加创建新连接的开销。 2. blockWhenExhausted 当 blockWhenExhausted 为 true 时,如果拿不到 Jedis 实例,线程将阻塞;反之,当为 false 时,线程将抛出异常,而非阻塞。 插曲:了解实时监控 Redis 的 TCP 连接情况的技能。先实时监控 Redis-server 的 TCP 连接数。 观察结果,确认是哪个连接,发现是 listen 的 TCP,与客户端无关,无需关注。 3. maxIdle 通过一段程序演示 maxIdle 的作用。先尝试获取 5 次资源,监控 TCP 连接数的变化。结果从 1 变为 6,即产生了 5 个 TCP 连接。执行 3 次 close 后,实际释放的 TCP 连接数量只有 1 个。总结,maxIdle 实际上反映了业务所需的最大连接数,maxTotal 用于提供余量,因此不要设置得过小。 4. timeBetweenEvictionRunsMillis 和 minEvictableIdleTimeMillis 在资源归还后,连接池会在 TimeBetweenEvictionRunsMillis + MinEvictableIdleTimeMillis 时间后自动释放 TCP 连接。这段时间分为检测线程周期执行检测和超时判断两个阶段。 5. minIdle 当 TimeBetweenEvictionRunsMillis + MinEvictableIdleTimeMillis 时间到后,连接池会自动释放 TCP 连接。但是,如果设置了 minIdle,连接池会至少保持 minIdle 的连接数。不会低于这个值释放连接。 二. Redis 服务端的超时配置 Redis 配置文件中有一个 timeout 参数,当设置为 0 时,表示永不超时;设置为其他数值,则表示到超时后会主动断开没有活跃请求的 TCP 连接。 三. 连接池配置建议 避免连接池伸缩带来的性能干扰。对于存在突峰访问的业务,建议将 maxTotal 和 minEvictableIdleTimeMillis 设置为相等。对于并发量不大或 maxIdle 设置过高的情况,可能会导致不必要的连接资源浪费。 若一个 Redis 命令请求执行需要 1ms,那么一个 TCP 的 QPS 就是 1 * 。如果 maxTotal 设置为 ,即同时最大 个 TCP 连接,总 QPS 将达到 * = 。在实际线上服务中,通常会使用集群,因此需要乘以机器数量。 但 Redis 有最大的连接限制,因此不建议 maxTotal 设置得过大。 四. Redis 服务端定位连接数 查看当前所有连接数,了解各个重要字段的含义。如果发现大部分连接的 age 和 idle 时间接近,可能意味着存在废物空闲连接。还有其他命令可用于主动杀死连接。 推荐关注进阶 JAVA 架构师 的博客,获取更多深入学习资源。2024-11-29 23:22
2024-11-29 22:46
2024-11-29 22:41
2024-11-29 22:21
2024-11-29 21:27