1. 程式人生 > >springBoot整合Redis遇到的坑(擇庫)原始碼分析為什麼擇庫失敗

springBoot整合Redis遇到的坑(擇庫)原始碼分析為什麼擇庫失敗

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.SpringBoot之所以好用就是因為他替我們做了很多以前我們需要手動在Spring中做的工作。

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

3.我們可以在這個package org.springframework.boot.autoconfigure.data.redis;下看到SB為我們預設實現的程式碼:

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(); } 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  //為什麼的我這個配置一直不生效呢?  我想你心裡應該有答案了