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);
	}

}

RedisTemplateStringRedisTemplate的区别。

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 })的作用是导入这两种连接的配置类。

image-20220410190427791

下面这个是RedisProperties类,首先是使用@ConfigurationProperties注解进行配置文件的绑定,这里绑定了前缀spring.redis所以我们可以直接在配置文件application.yml中配置redis。并且在该类中有很多默认的配置,比如端口号默认是6379,连接的主机默认是本地等等。redis一共有16个数据库,从源码可以看到,默认使用第一个数据库,也就是databases = 0。客户端类型有两种,可以选择LETTUCE,这是默认的,还有一个是JEDIS。这里需要注意,如果使用JEDIS作为客户端连接工具,则需要在pom.xml中引入jedis的依赖。

image-20220411133020702

image-20220411133843049

RedisTemplate对象通过调用setConnectionFactory方法,产生redis连接工厂,这样就可以连接到redis了。

image-20220410190314865

StringRedisTemplate是使用了构造方法来产生一个redis连接工厂。

image-20220410190338945

Q.E.D.


热爱生活,热爱程序