Spring boot
在2.x之后系统的redis
切换成了Lettuce
实现. 为了契合Spring boot
自动装配的思想和优点,尽量在使用的时候使用系统已经提供的,在不满足的情况下再自己自定义相关的bean
对象.
Redis介绍
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。相比Memcached它支持存储的类型相对更多(字符、哈希、集合、有序集合、列表、GEO),同时Redis是线程安全的。2010年3月15日起,Redis的开发工作由VMware主持,2013年5月开始,Redis的开发由Pivotal赞助。
Lettuce & Jedis
Lettuce 和 Jedis 的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
导入依赖
在pom.xml
添加spring-boot-starter-data-redis
的依赖, 在Spring boot 2.x
的版本之后默认底层提供的实现是使用Lettuce
, 而不是jedis
. 但是两种方式都提供的默认的实现
,大家可以根据自己的项目选择适合自己的版本
lettuce 版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
复制代码
jedis版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
复制代码
属性配置
在application.yaml
中添加如下内容, 对应的源代码可以在这里查看org.springframework.boot.autoconfigure.data.redis.RedisProperties
spring:
redis:
host: 192.168.123.225
database: 0
port: 6379
password:
# 保留一个
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 1
jedis:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 1
复制代码
redis 自动配置查看
在前面我曾经说过,尽量使用Spring
已经提供好的bean
, 具体位置 org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
这时候发现Spring
已经帮我们会自动注入redisTemplate
StringRedisTemplate
RedisConnectionFactory
, 这时候默认的一般不满足我们的需求,这时候只需要在定义一个RedisTemplate
即可, 而不需要所有的对象都自己重新自定义, Lettuce
和 Jedis
是自己各自的实现,只需要添加或排除具体的java类即可切换为各自不同的 RedisConnectionFactory
@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
public 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;
}
}
复制代码
局部代码块
@Configuration
@ConditionalOnClass({GenericObjectPool.class, JedisConnection.class, Jedis.class})
class JedisConnectionConfiguration extends RedisConnectionConfiguration {
...
@Configuration
@ConditionalOnClass({RedisClient.class})
class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
private final RedisProperties properties;
...
复制代码
测试代码直接看这里就可以了一起来学SpringBoot | 第九篇:整合Lettuce Redis