重學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

參考文章

相關文章
相關標籤/搜索