Redis系列文章------10.Springboot集成Redis

原创:兜里的猫

本章目录

  • 简单说明
  • 导入依赖
  • 源码分析
  • 配置连接
  • 代码测试

1. 简单说明

说明:在Springboot2.x之后,原来使用的jedis被替换成了lettuce。

jedis:采用直连,多线程操作是不安全的。如果想要避免不安全,需要使用jedis pool连接池。
       它更像是一种BIO(阻塞IO的多线程操作)模式。

lettuce:采用netty(异步请求的高性能网络框架),实例可以在多个线程中共享,不存在线程不安全的情况!可以减少线程数量。
它更像是一种NIO(非阻塞IO的多线程操作)模式。

springboot集成redis的依赖spring-boot-starter-data-redis中使用的是lettuce而不是jedis,而且lettuce底层使用的是netty。

2. 导入依赖

创建一个项目,Springboot集成Redis只需要导入一个依赖即可。

<!--springboot集成redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

3. 源码分析

# SpringBoot 所有的配置类,都有一个自动配置类  RedisAutoConfiguration(redis的自动配置类)
# 自动配置类是指SpringBoot会提供一个默认配置

自动配置类都会绑定一个properties 配置文件 RedisProperties(redis的配置文件)

1.首先打开 springboot 的 autoconfigure 自动配置包,打开配置文件,可以找到 redis 的自动配置类 RedisAutoConfiguration。

redis
redis

2.自动配置类 RedisAutoConfiguration 中使用

@EnableConfigurationProperties 注解,注入的 RedisProperties 就是 redis 的配置文件。

@ConditionalOnMissingBean 注解指当不存在 redisTemplate 时,会自动加载该bean,我们可以自定义一个 redisTemplate 来替换这个默认的。

默认的 RedisTemplate 没有过多的设置,redis 对象都需要序列化。

RedisTemplate<Object, Object> 两个泛型都是 Object, Object 类型,使用的时候需强制转换为 String, Object。

StringRedisTemplate:由于String是redis中最常用的类型,所以单独提出来一个bean。

redis
redis

3.RedisProperties 配置文件中,可以看到设置了一些基础的默认值,意味着我们可以不用自己配置,直接使用,但需要跟它默认的配置值一样。

prefix = "spring.redis" 这个前缀就表示我们在yml配置文件中配置redis的时候,所有配置都在spring.redis下面。

redis
redis

4.在 RedisAutoConfiguration 配置类中,redisTemplate 传入的是 RedisConnectionFactory redis连接的工厂接口类,这个接口有两个实现,一个redis的,一个lettuce的。

redis的实现类,可以将源码下载下来后发现很多报红,这就表示,这些报红的配置是spring无法读取的。

lettuce的实现类,将源码下载下来之后没有报红,这个里面的配置都是spring可以读取的。

所以这里就是为什么在我们的项目yml配置文件中,线程池使用 spring.redis.lettuce.pool ,而不是spring.redis.jedis.pool 的原因。

redis
redis

4. 配置连接

配置 application.yml

spring:
  redis:
    host: 127.0.0.1     #ip
    port: 6379          #端口
    password:           #密码
    database: 0         #redis有0-15共16个数据库,默认使用第0个

5. 代码测试

springboot 中使用 redisTemplate 对象来操作redis命令。

redisTemplate 的 opsForxxx 方法可以指定操作的数据类型,从下图中可以看到五大基本数据类型和三种特殊数据类型都是支持的。

redis
redis

在具体的操作上也是和原生的redis命令一样。

例如下图中的 opsForValue 方法,是操作字符串的,其中的api和原生的指令一样操作。

redis
redis

下图则是测试 redis 在 springboot 中的用法,以操作字符串的 get/set 为例,可以成功的存取键值。

redis
redis

当然,在正常的项目中,肯定是会将redis的操作进行封装,封装成工具类方便使用。

毕竟使用原生的redis操作是会有冗余的,就像操作原生的jdbc一样。

@RestController
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;

@RequestMapping("/test")
public String test() {
    // redisTemplate:操作不同的数据类型,api和使用的指令一样
    // opsForValue:操作字符串,类似String
    // opsForList: 操作List,类似List

    /*redisTemplate.opsForValue();
    redisTemplate.opsForList();*/

    // 除了基本的操作,常用的方法都可以使用redisTemplate操作,比如:事务

    // 获取redis的连接对象
    /*RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
    connection.flushDb();*/

    // 测试使用
    redisTemplate.opsForValue().set("name", "ethan");
    System.out.println(redisTemplate.opsForValue().get("name"));

    return (String) redisTemplate.opsForValue().get("name");
}

}

redis
redis

上面的java代码中我们操作redisTemplate存入了一个 name:ethan 的键值对,也成功的返回了value值。

然后我使用命令行查看redis数据库刚存入的key时,发现name前面多了一些字符。这是由于redis中的对象都需要序列化,而这里没有进行序列化操作导致,所以这就有问题。

为了解决这一问题,我们需要处理 springboot 中默认的配置类 RedisAutoConfiguration 中的 RedisTemplate<Object, Object> 对象的泛型,强转为 <String, Object>,所以需要我们自定义一个 RedisConfig 配置类,覆盖 springboot 默认的 redis 配置类,在我们自定义的 RedisConfig 配置类中对String进行序列化。这样就能很好的解决以上的问题。当然,自定义的配置类还可以对其他的进行配置。所以这就是为什么我们需要自行创建redis配置类!

所以我们需要重新编写 redisTemplate ,因为 springboot 默认的 RedisAutoConfiguration 配置类中,redisTemplate 方法上有个 @ConditionalOnMissingBean 注解,表示如果不存在该配置 bean,则生效默认配置的redisTemplate bean,只要我们重新定义该 bean 就可以使用我们自定义的 redisTemplate ,使默认的失效!

小程序码【兜里的猫】

小程序码

欢迎访问博客网页版:www.wldeer.com
关注公众号:(同步更新)【FreeWeb开发者】
# Redis 

评论

稻城 : 111
兜里的猫 : 是md
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×