天天看點

【Redis】SpringBoot整合Redis源碼分析

一.Jedis被替換了

    在SpringBoot2.x之後,原來使用的jedis被替換為了lettuce,從spring-boot-starter-data-redis-2.2.5.RELEASE.pom中可以看出來,為啥被替換了查閱資料是說

jedis:采用的直連,多個線程操作的話,是不安全的,如果想要避免不安全使用jedis pool連接配接池!更像BIO模式

lettuce:采用netty,執行個體可以再多個線程中進行共享,不存線上程不安全的情況,可以減少線程的資料,更像NIO模式。

【Redis】SpringBoot整合Redis源碼分析

二.Redis自動配置

SpringBoot所有的配置類,都有一個自動配置類,自動配置類都會綁定一個properties配置檔案
【Redis】SpringBoot整合Redis源碼分析
【Redis】SpringBoot整合Redis源碼分析
【Redis】SpringBoot整合Redis源碼分析

三.Jedis被替換成lettuce原因

@Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )// 我們可以自己定義一個redisTemplate來替換這個預設的
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        // 預設的 RedisTemplate 沒有過多的設定,redis 對象都是需要序列化!
        // 兩個泛型都是 Object, Object 的類型,我們後使用需要強制轉換 <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;
    }
           

 從RedisConnectionFactory中可以看出RedisConnection有兩個接口JedisConnectionFactory和LettuceConnectionFactory

public interface RedisConnectionFactory extends PersistenceExceptionTranslator {
    RedisConnection getConnection();

    RedisClusterConnection getClusterConnection();

    boolean getConvertPipelineAndTxResults();

    RedisSentinelConnection getSentinelConnection();
}
           
【Redis】SpringBoot整合Redis源碼分析

一個個點選去發現,JedisConnectionFactory裡面根本沒有注入成功,爆紅。是以SpringBoot2.x之後,原來使用的jedis被替換為了lettuce。

四.測試

【Redis】SpringBoot整合Redis源碼分析

繼續閱讀