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

Spring boot 在2.x以后系统的redis 切换成了Lettuce实现. 为了契合Spring boot自动装配的思想和优势,尽可能在使用的时候使用系统已经提供的,在不知足的状况下再本身自定义相关的bean 对象.html

Redis介绍

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

Lettuce & Jedis

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

导入依赖

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

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.RedisPropertiesspring

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类便可切换为各自不一样的 RedisConnectionFactorysql

@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 Redisapache

参考文章

相关文章
相关标签/搜索