欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-10-03 15:07:02
创建项目创建一个SpringBoot项目,我就用快速方法建的主要要注意一个点:记得勾选NoSql中的Spring Data Redis简单看一下pom文件Redis主要需要下面的这依赖 org.springframework.boot spring-boot-starter-data-redis

创建项目

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

简单看一下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,使用的时候需要强转 <String, Object>
        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

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
发现 key 前面有 一串乱码、获取key值也是为nil?

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

RedisTemplate详细深入

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

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

本文地址:https://blog.csdn.net/weixin_43157543/article/details/107584095

相关标签: # redis 数据库