详解SpringBoot整合Redis

详解SpringBoot整合RedisSpringBoot 整合 Redis 在 SpringBoot 中一般使用 RedisTemplat 提供的方法来操作 Redis 那么使用 SpringBoot 整合 Redis 需要那些步骤呢 1 JedisPoolCon 这个是配置连接池 2 RedisConnect 这个是配置连接信息 这里的 RedisConnect 是一个接口 我们需要使用它的实

SpringBoot整合Redis

  • 1.JedisPoolConfig(这个是配置连接池)
  • 2.RedisConnectionFactory(这个是配置连接信息,这里的RedisConnectionFactory是一个接口,
    我们需要使用它的实现类,在SpringD Data Redis方案中提供了一下四种工厂模型)

    • JredisConnectionFactory
    • JedisConnectionFactory
    • LettuceConnectionFactory
    • SrpConnectionFactory
  • 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

(0)
上一篇 2026年3月19日 上午8:05
下一篇 2026年3月19日 上午8:05


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号