redis之Springboot源码解析

Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接。

Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。lettuce主要利用netty实现与redis的同步和异步通信。

java 复制代码
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean(name = "redisTemplate")
	public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
			throws UnknownHostException {
		RedisTemplate<Object, Object> template = new RedisTemplate<>();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}

	@Bean
	@ConditionalOnMissingBean
	public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
			throws UnknownHostException {
		StringRedisTemplate template = new StringRedisTemplate();
		template.setConnectionFactory(redisConnectionFactory);
		return template;
	}
}

LettuceConnectionConfiguration、JedisConnectionConfiguration有个公共功能是创建jedis连接工厂类之JedisConnectionFactory。由于先解析LettuceConnectionConfiguration类,所以两者配置类都满足的前提下,优先通过LettuceConnectionConfiguration创建JedisConnectionFactory。

1.JedisConnectionConfiguration

java 复制代码
@ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class })
class JedisConnectionConfiguration extends RedisConnectionConfiguration {
	@ConditionalOnMissingBean(RedisConnectionFactory.class)
	public JedisConnectionFactory redisConnectionFactory() throws UnknownHostException {
		return createJedisConnectionFactory();
	}
}

JedisConnectionConfiguration发挥作用的前提条件之一是存在Jedis类,该类是通过以下依赖引入的:

java 复制代码
 <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

2.LettuceConnectionConfiguration

java 复制代码
@Configuration
@ConditionalOnClass(RedisClient.class)
class LettuceConnectionConfiguration extends RedisConnectionConfiguration {

	@Bean
	@ConditionalOnMissingBean(RedisConnectionFactory.class)
	public LettuceConnectionFactory redisConnectionFactory(ClientResources clientResources)
			throws UnknownHostException {
		LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(clientResources,
				this.properties.getLettuce().getPool());
		return createLettuceConnectionFactory(clientConfig);
	}
}

LettuceConnectionConfiguration配置类发挥作用的前提条件之一是存在Jedis类,该类是通过以下依赖引入的:

java 复制代码
 <dependency>
   <groupId>io.lettuce</groupId>
   <artifactId>lettuce-core</artifactId>
   <version>5.1.7.RELEASE</version>
   <scope>compile</scope>
 </dependency>

在SpringBoot项目中spring-boot-starter-data-redis包下默认存在lettuce-core

相关推荐
一 乐10 小时前
医院挂号|基于springboot + vue医院挂号管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·医院挂号管理系统
M--Y10 小时前
Redis的主从复制和哨兵
redis·主从复制·哨兵
ego.iblacat10 小时前
Redis 核心概念与部署
数据库·redis·缓存
卢傢蕊12 小时前
NoSQL 之 Redis 配置与优化
redis·nosql
better_liang12 小时前
每日Java面试场景题知识点之-MCP协议在Java开发中的应用实践
java·spring boot·ai·mcp·企业级开发
炸炸鱼.12 小时前
NoSQL 之 Redis 配置与优化
redis·nosql
河阿里12 小时前
SpringBoot :使用 @Configuration 集中管理 Bean
java·spring boot·spring
Flittly12 小时前
【SpringSecurity新手村系列】(4)验证码功能实现
java·spring boot·安全·spring
J超会运12 小时前
Redis高效配置与优化指南
redis
苏渡苇12 小时前
5 分钟跑起 Redis(Docker 版)
数据库·redis·缓存·docker·redis入门