Redis学习(五)---SpringBoot整合Redis

创建项目

创建一个SpringBoot项目,我就用快速方法建的
主要要注意一个点:记得勾选NoSql中的Spring Data Redis
Redis学习(五)---SpringBoot整合Redis_第1张图片

简单看一下pom文件

Redis主要需要下面的这依赖

  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
  </dependency>

我们点进去看一下:ctrl+鼠标左键
下面就是spring-boot-starter-data-redis的基本依赖

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.3.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>2.3.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <!--Jedis 改成 lteeuce >
    <dependency>
      <groupId>io.lettuce</groupId>
      <artifactId>lettuce-core</artifactId>
      <version>5.3.2.RELEASE</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

我们仔细看一下这个依赖,发现没有Jedis这个链接工具,为什么?
原因:
SpringBoot2.x之后,原来的Jedis被替换成了lettuce

  • Jedis:Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个Jedis实例增加物理连接
  • lettuce:Lettuce的连接是基于Netty的,连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例

Redis自动配置类(源码)

  • spring boot搜友的配置类都有一个自动配置类
  • redis的自动配置类就是 RedisAutoConfiguration
  • 自动配置类都会自动绑定一个配置文件
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.boot.autoconfigure.data.redis;


@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
//RedisProperties  绑定的默认配置类
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    //ConditionalOnMissingBean 这个注解的疑是就是:如果这个bean不存在的话,下面的方法就生效,也就是我们可以自己声明的一个redisTemplate来替换下面默认的方法
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
    //默认的redisTemplate 没有过多的设置,每一个redis对象都需要序列化
    //两个泛型都是Objiect,使用的时候需要强转 
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    
    @Bean
    @ConditionalOnMissingBean //String是redis最常用的数据类型,所以单独封装了一个bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

默认配置文件(源码)

# redis 配置
spring.redis.host=127.0.1
spring.redis.port=6379

下面图片就是自动配置类的源码:

  • 默认配置三个信息:database = 0、host = ‘localhsot’、port=6379
    Redis学习(五)---SpringBoot整合Redis_第2张图片

RedisTemplate使用

  • RedisTemplate 也是操作redis的工具
  • 其实你只要熟悉redis的命令、RedisTemplate的方法也是大致相同的
  • opsFor[数据类型],例:RedisTemplate.opsForValue就是操作String数据类型的

下面测试:

@SpringBootTest
class RedisSpringbootApplicationTests {

    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        /**
         * opsFor 就是操作某个数据类型
         * opsForValue - String
         * opsForSet   - Set
         * 等等其他也都是一样的
          */
        //获取连接对象
       RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
       connection.flushDb();

        redisTemplate.opsForValue().set("myKey","redis");
        System.out.println(redisTemplate.opsForValue().get("myKey"));
    }

}

测试成功!
我们去redis上获取一下键值:
Redis学习(五)---SpringBoot整合Redis_第3张图片
发现 key 前面有 一串乱码、获取key值也是为nil?

  • 原因是:redis对象都需要序列化

RedisTemplate详细深入

下面的内容还有点多,我还是写在下一篇吧

Redis学习(六)—RedisTemplate序列化、自定义RedisTemplate,RedisTemplate工具.

你可能感兴趣的:(#,redis,数据库)