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

相关推荐
青石路14 分钟前
明明连接的是Redis的DB0,为什么能查到DB3的数据?
redis
Jul1en_36 分钟前
【Redis】List列表命令、编码方式及应用场景
数据库·redis·list
Flittly38 分钟前
【SpringSecurity新手村系列】(1)初识安全框架
java·spring boot·安全·spring·安全架构
码界奇点39 分钟前
基于Spring Boot的插件化微服务热更新系统设计与实现
spring boot·后端·微服务·架构·毕业设计·源代码管理
身如柳絮随风扬39 分钟前
分布式锁深度剖析:ZooKeeper(CP)与 Redis(AP)的实现原理与对比
redis·分布式·zookeeper
码界奇点1 小时前
基于Spring Boot与Vue的教务管理系统设计与实现
vue.js·spring boot·后端·java-ee·毕业设计·源代码管理
Flying pigs~~1 小时前
企业级模块化RAG项目(mysql➕redis➕milvus➕模型微调➕bm25➕fastapi➕ollama➕Prompt➕多策略选择)
人工智能·redis·mysql·docker·prompt·milvus·rag
我登哥MVP1 小时前
【SpringMVC笔记】 - 5 - View
java·spring boot·spring·servlet·tomcat·maven·intellij-idea
程序员雷欧1 小时前
Redis进阶知识全解析:高可用部署与数据一致性实战
数据库·redis·缓存