springBoot集成Redis遇到的坑(擇庫)源碼分析為什么擇庫失敗


提示:

springboot提供了一套鏈接redis的api,也就是個jar包,用到的連接類叫做LettuceConnectionConfiguration,所以我們引入pom時是這樣的

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果你想使用其他鏈接redis的api,最常用的基本上就是Jedis的JedisConnectionFactory那么你就需要引入jedis,然后exclusions掉springboot提供做Lettuce:

<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>redis.clients</groupId>
      <artifactId>jedis</artifactId>
</dependency>

 

1.配置實現SpringBoot集成Redis(只需兩步)

1.最簡單的配置就是在application.propertity中配置

#cache指定緩存類型
spring.cache.type=REDIS

#data-redis
spring.redis.database=15
spring.redis.password=
spring.redis.host=192.168.**.**
spring.redis.port=6379
spring.redis.timeout=2000
spring.redis.jedis.pool.max-active=8 
spring.redis.jedis.pool.max-idle=8 
spring.redis.jedis.pool.max-wait=-1 
spring.redis.jedis.pool.min-idle=0 

2.啟動類開啟緩存

@SpringBootApplication
@EnableCaching public class EvaluationApplication {}

好了,配置好了!!

2.你有沒有想過為啥SpringBoot集成Redis的配置那么簡單?

原因:

1.SB之所以好用就是因為SB替我們做了很多以前我們需要手動在Spring中做的工作。

2.SB中默認是帶了一個jar包:org.springframework.boot.autoconfigure這個包包含了大部分SpringBoot默認實現的功能,感興趣的童鞋可以自己看下

3.我們可以在這個package org.springframework.boot.autoconfigure.data.redis;下看到SB為我們默認實現的集成Redis的代碼:

4.我們可以看到有個JedisConnectionConfiguration

@Configuration //啟動加載
@ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class })
class JedisConnectionConfiguration extends RedisConnectionConfiguration {

    private final RedisProperties properties;

    private final List<JedisClientConfigurationBuilderCustomizer> builderCustomizers;

    JedisConnectionConfiguration(RedisProperties properties,
            ObjectProvider<RedisSentinelConfiguration> sentinelConfiguration,
            ObjectProvider<RedisClusterConfiguration> clusterConfiguration,
            ObjectProvider<List<JedisClientConfigurationBuilderCustomizer>> builderCustomizers) {
        super(properties, sentinelConfiguration, clusterConfiguration);
        this.properties = properties;
        this.builderCustomizers = builderCustomizers
                .getIfAvailable(Collections::emptyList);
    }

    @Bean  //啟動加載JedisConnectionFactory放入spring的容器中
    @ConditionalOnMissingBean(RedisConnectionFactory.class)
    public JedisConnectionFactory redisConnectionFactory() throws UnknownHostException {
        return createJedisConnectionFactory();
    }

  //我們可以看到SB為我們默認提供了三種加載方式
private JedisConnectionFactory createJedisConnectionFactory() { JedisClientConfiguration clientConfiguration = getJedisClientConfiguration(); if (getSentinelConfig() != null) {//如果配置文件中配置了多個節點,則以多節點方式加載 此方式上面配置部分無效,詳情看源碼 return new JedisConnectionFactory(getSentinelConfig(), clientConfiguration); } if (getClusterConfiguration() != null) {//如果配置了集群則以集群方式加載 此方式上面配置部分無效,詳情看源碼 return new JedisConnectionFactory(getClusterConfiguration(), clientConfiguration); } return new JedisConnectionFactory(getStandaloneConfig(), clientConfiguration);//以單節點的方式加載redis配置,上面配置生效 }

5.附上最后一種方式加載配置的源碼

protected final RedisStandaloneConfiguration getStandaloneConfig() {
        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
        if (StringUtils.hasText(this.properties.getUrl())) {
            ConnectionInfo connectionInfo = parseUrl(this.properties.getUrl());
            config.setHostName(connectionInfo.getHostName());
            config.setPort(connectionInfo.getPort());
            config.setPassword(RedisPassword.of(connectionInfo.getPassword()));
        }
        else {
            config.setHostName(this.properties.getHost()); //這個propertity加載的就是上面我們貼出來的配置,源碼可以看到上面圖片中有個RedisPropertity類,配置文件中的配置就是根據這個類配置的
            config.setPort(this.properties.getPort());
            config.setPassword(RedisPassword.of(this.properties.getPassword()));
        }
        config.setDatabase(this.properties.getDatabase()); return config;
    }

3.那么問題來了,為什么我一直擇庫失敗呢?

spring.redis.database=15  //為什么的我這個配置一直不生效呢?  我想你心里應該有答案了

 如果解決了你的問題,幫忙點個贊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM