1. 导入Redis相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
导入了相关的依赖后会有自动配置类,找到自动配置类RedisAutoConfiguration
。该自动配置类有两个方法,如下。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
return new StringRedisTemplate(redisConnectionFactory);
}
}
RedisTemplate
和StringRedisTemplate
的区别。
RedisTemplate
键值对可以是Object类型,但是StringRedisTemplate
,的键只能是String类型,值可以是Object类型。
2. 配置Redis
在application.yml
中配置redis
。
spring:
redis:
host: 127.0.0.1
Redis底层默认是使用Lettuce作为客户端的,如需要使用jedis作为客户端管理工具,需要在pom.xml中引入jedis的依赖。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
application.yml配置则如下。
spring:
redis:
host: 127.0.0.1
client-type: jedis
jedis:
pool:
max-active: 10
min-idle: 5
如果你的redis配置了连接密码,可以用下面的方式进行配置。
spring:
redis:
host: 127.0.0.1
password: 123456
编写技术器
首先我们需要写一个拦截器的组件,然后将组件注册进来。
编写redis拦截组件。
@Component
public class RedisUrlCountInterceptor implements HandlerInterceptor {
@Autowired
StringRedisTemplate redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
// 默认每次访问当前 uri 就会计数+1
redisTemplate.opsForValue().increment(uri);
return true;
}
}
把该组件注册到拦截器中。
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
RedisUrlCountInterceptor redisUrlCountInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(redisUrlCountInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/images/**", "/js/**");
}
}
分析Redis自动装配原理
找到RedisAutoConfiguration
类,可以看到该类有连个方法,RedisTemplate<Object, Object>
和StringRedisTemplate
,这两者的区别上面已经介绍了,这里就不再叙述。
该类的注解如下图所示。
- 其中
@Configuration(proxyBeanMethods = false)
表示lite模式。lite
模式中,每次都会创建新的bean
实例。不用到容器中检查是否存在该bean
实例,能够加快SpringBoot
的启动速度。 @ConditionalOnClass(RedisOperations.class)
表示某个RedisOperations
位于类路径上,才会实例化一个Bean
。@EnableConfigurationProperties(RedisProperties.class)
表示使使用了@ConfigurationProperties
的类生效,即我们配置的properties
文件可以生效,可以从properties
配置文件中读取数据,当然也可以是yml
文件。这里表示绑定了RedisProperties
类中的属性,我们可以在application.yml
中配置redis
的属性值。@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })
的作用是导入这两种连接的配置类。
下面这个是RedisProperties
类,首先是使用@ConfigurationProperties
注解进行配置文件的绑定,这里绑定了前缀spring.redis
所以我们可以直接在配置文件application.yml
中配置redis
。并且在该类中有很多默认的配置,比如端口号默认是6379,连接的主机默认是本地等等。redis
一共有16个数据库,从源码可以看到,默认使用第一个数据库,也就是databases = 0
。客户端类型有两种,可以选择LETTUCE
,这是默认的,还有一个是JEDIS
。这里需要注意,如果使用JEDIS
作为客户端连接工具,则需要在pom.xml
中引入jedis
的依赖。
RedisTemplate
对象通过调用setConnectionFactory
方法,产生redis
连接工厂,这样就可以连接到redis
了。
StringRedisTemplate
是使用了构造方法来产生一个redis
连接工厂。
Q.E.D.