SpringBoot:整合Redis
跳到导航
跳到搜索
关于
关于使用 Redis 的使用:
配置文件
- 配置依赖:在 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;
- 连接信息:在 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;
}
}
如上:
- “@Configuration”:表明这是一个配置类,并尝试注入Spring容器。
- “@ConditionalOnClass(RedisOperations.class)”:当 classpath 下存在“RedisOperations”类时,被“@ConditionalOnClass”注解的类才能注入 Spring 容器。
- “@EnableConfigurationProperties(RedisProperties.class)”:将被“@ConfigurationProperties”注解的“RedisProperties” 类注入为 Spring 容器的 Bean。
- “@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })”:注入“LettuceConnectionConfiguration”与“JedisConnectionConfiguration”为 Spring 容器的 Bean。
- “@Bean”:尝试将实例注入 Spring 容器。
- “@ConditionalOnMissingBean”:当容器中不存在类的实例时,被“@ConditionalOnMissingBean”注解的类 或 被“@ConditionalOnMissingBean”注解的方法的返回的实例,才能注入Spring容器。
总结:
当 SpringBoot 中引入了对 Redis 的支持,且用户没有主动注入 RedisTemplate 和 StringRedisTemplate 模板时,SpringBoot 才会往 Spring 中注入默认的 RedisTemplate 和 StringRedisTemplate 模板。 换句话说:如果 Spring 容器中有了 RedisTemplate 对象了,这个自动配置的 RedisTemplate 和 StringRedisTemplate 不会实例化。
RedisTemplate 和 StringRedisTemplate
从源码可以看出,SpringBoot 自动生成的模板类型为:RedisTemplate<Object, Object> 和 StringRedisTemplate。
区别:
- RedisTemplate<Object, Object>:默认各个“key-value”序列化器,均采用 JdkSerializationRedisSerializer。
- 所以:其存储的 key、value 为序列化转义的值;
- 适用于:要存储的数据比较复杂时;(如:一个对象,一个map对象,一个数组等)
- 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”;