SpringBoot整合Redis
- 1.JedisPoolConfig(这个是配置连接池)
- 2.RedisConnectionFactory(这个是配置连接信息,这里的RedisConnectionFactory是一个接口,
我们需要使用它的实现类,在SpringD Data Redis方案中提供了一下四种工厂模型)
JredisConnectionFactoryJedisConnectionFactoryLettuceConnectionFactorySrpConnectionFactory
- 3.RedisTemplate
1、添加启动器
<dependency> <groupId>org.springframework.boot
groupId> <artifactId>spring-boot-starter-data-redis
artifactId>
dependency>
2、配置连接信息
spring: redis: host: 127.0.0.1 port: 6379 password: jedis: pool: max-active: 8 max-wait: -1 max-idle: 500 min-idle: 0 lettuce: shutdown-timeout: 0
3、测试
@RunWith(SpringRunner.class) @SpringBootTest public class Test_1{
@Autowired private RedisTemplate<String,String>redisTemplate; @Test public void set(){
redisTemplate.opsForValue().set("myKey","myValue"); System.out.println(redisTemplate.opsForValue().get("myKey")); } }
4、查看结果

5、序列化器
这里先说一下Spring提供了那些序列化器(各自作用自行百度,这里不再赘述)
Jackson2JsonRedisSerializer
JdkSerializationRedisSerializer
OxmSerializer
StringRedisSerializer
GenericToStringRedisSerializer
GenericJackson2JsonRedisSerializer
然后以下是一些问题需要搞清楚
- 为什么需要序列化?
你要记住一句话,在JAVA中,一切皆对象,而将对象的状态信息转为存储或传输的形式需要序列化。
- 为什么前面的代码没有设置序列化?
原因是是因为我们使用了@AutoWired,IOC容器为我们选择了StringRedisTemplate类来注入
以下是单步调试的截图

这里是RedisTemplate的继承关系图

然后我们跟踪源码可以发现
StringRedisTemplate.java
public StringRedisTemplate() { setKeySerializer(RedisSerializer.string()); setValueSerializer(RedisSerializer.string()); setHashKeySerializer(RedisSerializer.string()); setHashValueSerializer(RedisSerializer.string()); } RedisSerializer.java
static RedisSerializer<String> string() {
return StringRedisSerializer.UTF_8; }
StringRedisSerializer.java
public static final StringRedisSerializer UTF_8 = new StringRedisSerializer(StandardCharsets.UTF_8);
StringRedisTemplate默认选择的StringRedisSerializer序列化器
- 那假如我们把Value的类型改为Object呢
@RunWith(SpringRunner.class) @SpringBootTest public class Test_1{
@Resource private RedisTemplate<String,Object>redisTemplate; @Test public void set(){
redisTemplate.opsForValue().set("myKey","myValue"); System.out.println(redisTemplate.opsForValue().get("myKey")); } }
注意:这里继续使用@AutoWired会报错,需要使用@Resource,这两个注解的区别在前者是根据类型后者
是根据名字,具体区别自行查资料(这里说一下为什么会报错:@AutoWired找不到该类型
的Bean因为根本没有。使用@Resource直接注入的是RedisTemplate)

然后运行代码,我们去看RedisManeger

咦?怎么会这样?
这是因为没有设置序列化器,RedisTemplate选择了默认的序列化器JdkSerializationRedisSerializer
官方文档是这样说的:
RedisTemplate (Spring Data Redis 2.1.4.RELEASE API)
6、配置序列化器
@RunWith(SpringRunner.class) @SpringBootTest public class Test_1{
@Resource private RedisTemplate<String,Object>redisTemplate; @Test public void set(){
redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setKeySerializer(RedisSerializer.string()); //或者 //redisTemplate.setKeySerializer(new StringRedisSerializer()); //redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.opsForValue().set("myKey","myValue"); System.out.println(redisTemplate.opsForValue().get("myKey")); } }
@Configuration public class RedisConfig{
@Bean public RedisTemplate<String,Object>redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object>template=new RedisTemplate<>(); //关联 template.setConnectionFactory(factory); //设置key的序列化器 template.setKeySerializer(new StringRedisSerializer()); //设置value的序列化器 template.setValueSerializer(new StringRedisSerializer()); return template; } }
为什么说更多的时候采用这种方法呢,实际情况中可能有多种需求,泛型各不相同,比如有
直接在Config类里面在加一个方法就行。
7、完整例子(将实体类以JSON的形式储存到Redis中)
1、先给出entity(记住实体要序列化一定要实现Serializable接口)
@Data public class Days implements Serializable {
private String openId; private String daysId; //每天的标题 private String title; //代办事项的数量 private int itemNumber; //日程 private String date; }
2、然后在配置类中设置序列化器
@Configuration public class RedisConfig{
@Bean public RedisTemplate<String, Days>redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Days>template=new RedisTemplate<>(); //关联 template.setConnectionFactory(factory); //设置key的序列化器 template.setKeySerializer(new StringRedisSerializer()); //设置value的序列化器 template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Days.class)); return template; } }
3、测试类
@RunWith(SpringRunner.class) @SpringBootTest public class RedisTest {
@Autowired private RedisTemplate<String,Days> redisTemplate; private Days d; @Before public void before(){
d=new Days(); d.setDate("123"); d.setDaysId("456"); d.setItemNumber(123); d.setOpenId("dawda"); d.setTitle("title"); } @Test public void testSet(){
this.redisTemplate.opsForValue().set("days",d); System.out.println((redisTemplate.opsForValue().get("days"))); } }
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/210204.html原文链接:https://javaforall.net
