重学Java | 从源码学习 springboot redis使用

Spring boot 在2.x之后系统的redis 切换成了Lettuce实现. 为了契合Spring boot自动装配的思想和优点,尽量在使用的时候使用系统已经提供的,在不满足的情况下再自己自定义相关的bean 对象.

Redis介绍

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。相比Memcached它支持存储的类型相对更多(字符、哈希、集合、有序集合、列表、GEO),同时Redis是线程安全的。2010年3月15日起,Redis的开发工作由VMware主持,2013年5月开始,Redis的开发由Pivotal赞助。

Lettuce & Jedis

Lettuce 和 Jedis 的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。

导入依赖

pom.xml 添加spring-boot-starter-data-redis的依赖, 在Spring boot 2.x的版本之后默认底层提供的实现是使用Lettuce, 而不是jedis. 但是两种方式都提供的默认的实现,大家可以根据自己的项目选择适合自己的版本

lettuce 版本


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
复制代码

jedis版本

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
复制代码

属性配置

application.yaml中添加如下内容, 对应的源代码可以在这里查看org.springframework.boot.autoconfigure.data.redis.RedisProperties

spring:
  redis:
    host: 192.168.123.225
    database: 0
    port: 6379
    password:
    # 保留一个
    lettuce:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 1
    jedis:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 1
复制代码

redis 自动配置查看

在前面我曾经说过,尽量使用Spring已经提供好的bean, 具体位置 org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration 这时候发现Spring已经帮我们会自动注入redisTemplate StringRedisTemplate RedisConnectionFactory, 这时候默认的一般不满足我们的需求,这时候只需要在定义一个RedisTemplate 即可, 而不需要所有的对象都自己重新自定义, LettuceJedis 是自己各自的实现,只需要添加或排除具体的java类即可切换为各自不同的 RedisConnectionFactory

@Configuration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        StringRedisTemplate template = new StringRedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

复制代码

局部代码块

@Configuration
@ConditionalOnClass({GenericObjectPool.class, JedisConnection.class, Jedis.class})
class JedisConnectionConfiguration extends RedisConnectionConfiguration {
...

@Configuration
@ConditionalOnClass({RedisClient.class})
class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
    private final RedisProperties properties;
...
复制代码

测试代码直接看这里就可以了一起来学SpringBoot | 第九篇:整合Lettuce Redis

参考文章

猜你喜欢

转载自juejin.im/post/5d53bffc6fb9a06af13d6175
今日推荐