1. 程式人生 > >springboot配置多個redis連線

springboot配置多個redis連線

一、springboot nosql 簡介 Spring Data提供其他專案,用來幫你使用各種各樣的NoSQL技術,包括MongoDB, Neo4J, Elasticsearch, Solr, Redis,Gemfire, Couchbase和Cassandra。Spring Boot為Redis, MongoDB, Elasticsearch, Solr和Gemfire提供自動配置。你可以充分利用其他專案,但你需要自己配置它們。 1.1、Redis 是一個快取,訊息中介軟體及具有豐富特性的鍵值儲存系統。Spring Boot為Jedis客戶端庫和由Spring Data Redis提供的 基於Jedis客戶端的抽象提供自動配置。 spring-boot-starter-redis 'Starter POM'為收集依賴提供一種便利的方式。Redis 新增maven依賴
            <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
			<!-- <version>1.3.5.RELEASE</version> -->
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-commons -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-redis</artifactId>
			<!-- <version>1.3.6.RELEASE</version> -->
		</dependency>


1.2連線Redis 你可以注入一個自動配置的RedisConnectionFactory,StringRedisTemplate或普通的跟其他Spring Bean相同的RedisTemplate例項。預設情況下,這個例項將嘗試使用localhost:6379連線Redis伺服器。
@Component
public class MyBean {
private StringRedisTemplate template;
@Autowired
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
}


如果你新增一個你自己的任何自動配置型別的@Bean,它將替換預設的(除了RedisTemplate的情況,它是根據bean的名 稱'redisTemplate'而不是它的型別進行排除的)。如果在classpath路徑下存在commons-pool2,預設你會獲得一個連線池工 廠。 1.3 建立多個redis連線 使用redis的預設配置可以連線到redis中的0庫中,如果指定庫連線需要配置indexdb,同時如果需要連線多個redis服務,也需要同時配置多個數據源 1.3.1、application.yml 檔案 中增加:
@Component
public class MyBean {
private StringRedisTemplate template;
@Autowired
public MyBean(StringRedisTemplate template) {
this.template = template;
}
// ...
}

1.3.2、建立redisconfiguration
@Configuration
public class Redis137_11Configuration {

	@Bean(name = "redis123Template")
	public StringRedisTemplate redisTemplate(
			@Value("${redis123.hostName}") String hostName,
			@Value("${redis123.port}") int port,
			@Value("${redis123.password}") String password,
			@Value("${redis123.maxIdle}") int maxIdle,
			@Value("${redis123.maxTotal}") int maxTotal,
			@Value("${redis123.index}") int index,
			@Value("${redis123.maxWaitMillis}") long maxWaitMillis,
			@Value("${redis123.testOnBorrow}") boolean testOnBorrow) {
		StringRedisTemplate temple = new StringRedisTemplate();
		temple.setConnectionFactory(connectionFactory(hostName, port, password,
				maxIdle, maxTotal, index, maxWaitMillis, testOnBorrow));

		return temple;
	}

	public RedisConnectionFactory connectionFactory(String hostName, int port,
			String password, int maxIdle, int maxTotal, int index,
			long maxWaitMillis, boolean testOnBorrow) {
		JedisConnectionFactory jedis = new JedisConnectionFactory();
		jedis.setHostName(hostName);
		jedis.setPort(port);
		if (!StringUtils.isEmpty(password)) {
			jedis.setPassword(password);
		}
		if (index != 0) {
			jedis.setDatabase(index);
		}
		jedis.setPoolConfig(poolCofig(maxIdle, maxTotal, maxWaitMillis,
				testOnBorrow));
		// 初始化連線pool
		jedis.afterPropertiesSet();
		RedisConnectionFactory factory = jedis;

		return factory;
	}

	public JedisPoolConfig poolCofig(int maxIdle, int maxTotal,
			long maxWaitMillis, boolean testOnBorrow) {
		JedisPoolConfig poolCofig = new JedisPoolConfig();
		poolCofig.setMaxIdle(maxIdle);
		poolCofig.setMaxTotal(maxTotal);
		poolCofig.setMaxWaitMillis(maxWaitMillis);
		poolCofig.setTestOnBorrow(testOnBorrow);
		return poolCofig;
	}
}
  


1.3.3、宣告redis抽象基類,建立redis的操作方法
public abstract class AbRedisConfiguration {
	protected StringRedisTemplate temple;

	public void setData(String key, String value) {
		getTemple().opsForValue().set(key, value);
	}

	public String getData(String key) {
		return getTemple().opsForValue().get(key);
	}

	public StringRedisTemplate getTemple() {
		return temple;
	}
}


1.3.4、根據資料來源,建立不同的子類@Component
public class Redis123 extends AbRedisConfiguration {

	@Resource(name = "redis123Template")
	private StringRedisTemplate temple;

	public StringRedisTemplate getTemple() {
		return temple;
	}
}


ps:類和子類中同時聲明瞭getTemple方法和 StringRedisTemple屬性,子類通過重寫父類的getTeimple方法,把子類的自己StringRedisTemple 屬性 傳給 父類,父類通過子類傳遞過來的StringRedisTemple使用不通的資料鏈接來操作快取。至此,父類完成所有的操作方法,而當需要建立一個數據庫連線時,只需要在建立一個子類,被宣告自己的StringRedisTemple,並傳給父類即可。