SpringBoot:整合Redis

来自Wikioe
跳到导航 跳到搜索


关于

关于使用 Redis 的使用:

  1. 参见:spring-data-redis 的使用实践
  2. 参见:Spring 的 Redis缓存注解

配置文件

  1. 配置依赖:在 pom.xml 两种引入 Redis 依赖支持
    	<!--  加载 spring boot redis 包  -->
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-data-redis</artifactId>
    	</dependency>
        
       <!-- 因为,
    	     ,
    		 所以,考虑到常用性,直接用 spring-boot-starter-web 了 -->
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-web</artifactId>
    	</dependency>
    
    • 因为,自定义的模板中用到了 Jackson2JsonRedisSerializer 序列化器:所以需要引入 spring-boot-starter-json,而 spring-boot-starter-web 本身依赖有很多其他依赖(包括 spring-boot-starter-json)。
      • 如果不引入 spring-boot-starter-web,则需要单独引入 spring-boot-starter-json;
  2. 连接信息:在 application.properties 中配置
    # 配置 Redis:
    # Redis数据库索引(默认为0)
    spring.redis.database=0
    # Redis服务器地址
    spring.redis.host=192.168.255.129
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=
    # 连接池最大连接数(使用负值表示没有限制)
    spring.redis.jedis.pool.max-active=100
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.jedis.pool.max-wait=-1
    # 连接池中的最大空闲连接
    spring.redis.jedis.pool.max-idle=10
    # 连接池中的最小空闲连接
    spring.redis.jedis.pool.min-idle=0
    # 连接超时时间(毫秒)
    spring.redis.timeout=5000
    
    • 或者:使用“application.yml”:
      spring:
        redis:
          database: 0
          host: 192.168.255.129
          port: 6379
          password: 123456
          jedis:
            pool:
              max-active: 100
              max-idle: 10
              max-wait: -1
              min-idle: 0
          timeout: 1000
      

配置类

使用Redis

使用:模板

使用:注解

关于:Redis模板

以前都是直接使用 Lettuce 或 Jedis 等对 Redis 进行操作,不过后来 spring-boot-starter-data-redis 模板块儿项目对 Lettuce、Jedis 进行了封装改进,对外提供了一些操作 Redis 的模板,现在如果是 SpringBoot 的项目,一般都是直接使用模板进行 Redis 操作。

spring-boot-starter-data-redis 提供了好几个 Redis 操作模板:

  • RedisTemplate
  • StringRedisTemplate
  • ReactiveRedisTemplate
  • ReactiveStringRedisTemplate
  • RedisKeyValueTemplate


其中 RedisTemplate 和 StringRedisTemplate 是最常用的。

两者的数据是不共通的;也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据,RedisTemplate 只能管理 RedisTemplate 中的数据。


SpringBoot 默认注入的模板

在 SpringBoot 中 spring-boot-autoconfigure 模块的 RedisAutoConfiguration 配置类也默认注入了 RedisTemplate 和 StringRedisTemplate。

但,这个 RedisTemplate 的泛型是 <Object,Object>

RedisAutoConfiguration 源码:

@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
@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;
    }
}

如上:

  1. “@Configuration”:表明这是一个配置类,并尝试注入Spring容器。
  2. “@ConditionalOnClass(RedisOperations.class)”:当 classpath 下存在“RedisOperations”类时,被“@ConditionalOnClass”注解的类才能注入 Spring 容器。
  3. “@EnableConfigurationProperties(RedisProperties.class)”:将被“@ConfigurationProperties”注解的“RedisProperties” 类注入为 Spring 容器的 Bean。
  4. “@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })”:注入“LettuceConnectionConfiguration”与“JedisConnectionConfiguration”为 Spring 容器的 Bean。
  5. “@Bean”:尝试将实例注入 Spring 容器。
  6. “@ConditionalOnMissingBean”:当容器中不存在类的实例时,被“@ConditionalOnMissingBean”注解的类 或 被“@ConditionalOnMissingBean”注解的方法的返回的实例,才能注入Spring容器。


总结:

当 SpringBoot 中引入了对 Redis 的支持,且用户没有主动注入 RedisTemplate 和 StringRedisTemplate 模板时,SpringBoot 才会往 Spring 中注入默认的 RedisTemplate 和 StringRedisTemplate 模板。

换句话说:如果 Spring 容器中有了 RedisTemplate 对象了,这个自动配置的 RedisTemplate 和 StringRedisTemplate 不会实例化。

RedisTemplate 和 StringRedisTemplate

从源码可以看出,SpringBoot 自动生成的模板类型为:RedisTemplate<Object, Object>StringRedisTemplate

区别:

  1. RedisTemplate<Object, Object>:默认各个“key-value”序列化器,均采用 JdkSerializationRedisSerializer
    • 所以:其存储的 key、value 为序列化转义的值;
    • 适用于:要存储的数据比较复杂时;(如:一个对象,一个map对象,一个数组等)
  2. StringRedisTemplate:默认各个“key-value”序列化器,均采用 StringRedisSerializer.UTF_8 字符集的 StringRedisSerializer
    • 所以:其存储的 key、value 为普通字符串;
    • 适用于:存储的数据比较简单,无需改动时;(字符串类型数据)
  • “key-value”序列化器,包括:keySerializer、valueSerializer、hashKeySerializer、hashValueSerializer。


示例:

// 存储的 key 是:“\xac\xed\x00\x05t\x00\x03msg”
// 存储的 value 是:“\xac\xed\x00\x05t\x00\x03msg”
redisTemplate.opsForValue().set(msg,hello world);

// 存储的 key 是:“msg”
// 存储的 value 是:“\xac\xed\x00\x05t\x00\x03msg”
stringRedisTemplate.opsForValue().append(msg,hello);


由于 RedisTemplate<Object, Object> 存储的数据不便于阅读,读取、存储时需要相应的转换。

所以开发时一般都在 Redis 配置类中自定义模板 Bean:RedisTemplate<String, Object>

   1、其 keySerializer、hashKeySerializer 使用“StringRedisSerializer”;
   2、其 valueSerializer、hashValueSerializer 使用“Jackson2JsonRedisSerializer”;

关于:缓存管理器

使用一个管理器管理所有缓存类

配置多个缓存管理器分开管理