环境说明: Windows10、IntelliJ IDEA、SpringBoot 2.1.2.RELEASE
SpringBoot整合Redis:
第一步:在pom.xm两种引入Redis依赖支持
<!-- 引入Redis支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
第二步:在系统配置文件中配置Redis信息
# 单机版的redis可以这么连接
#spring.redis.host=192.168.1.108
#spring.redis.port=6379
# 对于单机版的Redis,可以使用此参数指定(数据库index),操作使用哪一个数据库
# Redis支持多个数据库(默认是16个,可通过配置来修改数据库数量),并且每个数据库的数据是隔离的,不能
# 共享,并且基于单机才有,如果是集群就没有数据库的概念,集群只有一个db0数据库。
#spring.redis.database=3
# redis集群
spring.redis.cluster.nodes = 10.8.109.24:6379, 10.8.109.36:6379, 10.8.109.49:6379, 10.8.109.24:6380, 10.8.109.36:6380, 10.8.109.49:6380
# 如果redis需要登录密码的话,需要给出
spring.redis.password = ds123
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是最常用的模板。
SpringBoot默认注入的模板:
RedisTemplate和StringRedisTemplate是最常用的模板;常用到甚至在SpringBoot中的spring-boot-autoconfigure模块儿下,都有一个配置类为我们默认注入了RedisTemplate与StringRedisTemplate:
上图中各注解说明:
- @Configuration:表明这是一个配置类,并尝试注入Spring容器。
- @ConditionalOnClass(RedisOperations.class):当classpath下存在RedisOperations类时,被@ConditionalOnClass注解注解了的类,才有资格注入Spring容器; 否者无资格注入Spring容器。
- @EnableConfigurationProperties(RedisProperties.class):将被@ConfigurationProperties注解注解了的RedisProperties类注入为Spring容器的Bean。
- @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }):注入LettuceConnectionConfiguration 与JedisConnectionConfiguration为Spring容器的Bean。
- @Bean:尝试将实例注入Spring容器。
- @ConditionalOnMissin:当容器中不存在类的实例时,被@ConditionalOnMissin注解注解了的类或被@ConditionalOnMissin注解注解了的方法的返回的实例,才有资格注入Spring容器; 否者无资格注入Spring容器。
注:还可通过设置属性值,如name属性值等,来进一步添加条件成立的约束条件。
简单来说,即:
当SpringBoot中引入了对Redis的支持且用户没有主动注入RedisTemplate和StringRedisTemplate模板时,SpringBoot才会往Spring中注入默认的RedisTemplate和StringRedisTemplate模板。
Redis模板使用示例:
默认模板的使用方式很简单,如:
运行测试类后,我们使用RedisDesktopManager工具连接Redis进行查看:
- RedisTemplate<Object, Object>模板的存储结果为:
说明:RedisTemplate<Object, Object>模板的存储结果“乱码”了,是因为RedisTemplate<Object, Object>模板的
默认的各种key-value序列化器(keySerializer、valueSerializer、hashKeySerializer、hashValueSerializer)
均采用的是JdkSerializationRedisSerializer。
- StringRedisTemplate模板的存储结果为:
说明:StringRedisTemplate模板的存储结果未乱码,是因为StringRedisTemplate模板的默认的各种key-value序
列化器(keySerializer、valueSerializer、hashKeySerializer、hashValueSerializer)均采用的是
StringRedisSerializer.UTF_8字符集的StringRedisSerializer序列化器。
注入自定义模板及使用示例:
说明:从上面,我们知道:默认的RedisTemplate<Object, Object>模板的序列化器会导致乱码,所以我们可以主动
注入一个自定义的RedisTemplate模板。
准备工作:因为下面我们自定义的模板中用到了Jackson2JsonRedisSerializer序列化器,所以需要引
入相关的依赖,本人这里直接引入:
<!--
引入spring-boot-starter-web依赖。
注:spring-boot-starter-web本身依赖有很多其他依赖,spring-boot-starter-json就是其一,
其实这里需要的也只是spring-boot-starter-json而已;不过考虑到spring-boot-starter-web的常用性,
所以这里干脆直接引入了pring-boot-starter-web依赖
注:如果不引入spring-boot-starter-web的话,那么这里需要单独引入spring-boot-starter-json依赖
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
注入自定义的RedisTemplate模板:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* 定制化RedisTemplate模板
*
* @author JustryDeng
* @date 2019/4/11 16:26
*/
@Configuration
public class MyRedisTemplate {
@Bean
@SuppressWarnings("unchecked")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
// 这里key采用String
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 设置key的 序列化 器
// 注:RedisTemplate对应的反序列化器与序列化器 一致,设置了序列化器就相当于设置了反序列化起
StringRedisSerializer keySerializer = new StringRedisSerializer();
template.setKeySerializer(keySerializer);
template.setHashKeySerializer(keySerializer);
//设置value的 序列化 器
//注:RedisTemplate对应的反序列化器与序列化器 一致,设置了序列化器就相当于设置了反序列化起
Jackson2JsonRedisSerializer valueSerializer
= new Jackson2JsonRedisSerializer(Object.class);
template.setValueSerializer(valueSerializer);
template.setHashValueSerializer(valueSerializer);
template.afterPropertiesSet();
return template;
}
}
注:如果需要注入自定义的StringRedisTemplate的话,就按照上图中相同的方式注入即可,不过由于默
认的StringRedisTemplate模板本身默认使用的就是StringRedisSerializer.UTF_8字符集的
StringRedisSerializer序列化器,所以对于StringRedisTemplate,我们可以直接使用SpringBoot为
我们默认注入的即可。
使用自定义的RedisTemplate模板示例:
运行完上图中的特使方法后,我们使用RedisDesktopManager工具连接Redis进行查看:
可以看见,使用了我们自定义的RedisTemplate模板并指定序列化器后,可以直观的观察数据了。
默认的StringRedisTemplate模板使用示例:
存储前与取出后都手动进行对象字符串间转换:
准备工作:引入阿里的Fastjosn依赖(本人以Fastjson为JSON格式化工具):
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.27</version>
</dependency>
使用默认的StringRedisTemplate示例:
import com.alibaba.fastjson.JSON;
import com.model.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class RedisApplicationTests {
@Autowired
StringRedisTemplate stringRedisTemplate;
/**
* 主动将对象转换为json字符串,在使用StringRedisTemplate模板进行存储与读取
*
* @date 2019/4/11 15:00
*/
@Test
public void originStringRedisTemplateTest() {
User user = User.builder().name("咿呀咔咔").age(25).motto("我是一只小小小小鸟~").gender("男").build();
// 将要放入缓存的对象先转换为JSON字符串
String jsonStr = com.alibaba.fastjson.JSON.toJSONString(user);
// 放入Redis
stringRedisTemplate.opsForValue().set("ds-key", jsonStr);
// 从Redis中获取
String getstr = stringRedisTemplate.opsForValue().get("ds-key");
// 将获取到的字符串转换为对应的对象
// 注意:JSON.parseObject此方法进行字符串对象转换时,依赖于实体模型的构造方法;如果
// 使用了lombok的@Builder注解,那么最好在补一个全餐构造,否则此步骤可能出现异常
User getUser = JSON.parseObject(getstr, User.class);
System.out.println(getUser);
}
}
运行完上图中的特使方法后,我们使用RedisDesktopManager工具连接Redis进行查看:
注:相比起我们使用自定义的RedisTemplate模板来讲,个人感觉使用StringRedisTemplate更顺手,因为放进去的、取
出来的就是json字符串,将json字符串转换为对象更方便。
注:现在主流的JSON格式化工具有阿里的Fastjson、谷歌的Gson等;Fastjson效果更高,不过如果是非常复杂的对象
的话Fastjson的转换结果可能并不如人所想,除非你编写的实体类模型是严格符合阿里巴巴规范编写的;Gson虽
然再转换速率上没有Fastjson快,但是在转换结果准确性方面却做得非常好,项目中用那种取决于自己项目情况。
RedisTemplate与StringRedisTemplate常用方法:
声明:本文主要介绍Redis模板相关知识以及对模板进行了简单的使用示例,下面再分享一张整理自
网友的Redis模板常用方法图,更多细节用
法请查阅相关文档。
常用方法:
P.S.虽然整理上图内容并不会太费劲,但是笔者今天属实有点头昏,就不整理了,直接从网友那里摘录吧。