Redis RedisCluster Spring整合
阿新 • • 發佈:2018-12-25
前言:
在上一篇文章中,用了jedisCluster來做redis叢集的客戶端,這一篇我們介紹一下spring-data-redis給我們提供的操作redis叢集的redisTemplate,著急用的可以跳過1,直接看2
準備工作:
jdk版本:1.8
junit版本:4.12
jar包版本:
<!-- jedis Java介面 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> <type>jar</type> </dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.4.RELEASE</version> </dependency>
1:RedisTemplate由來簡介
在網上沒有找到redisTemplate操作redis叢集的例子,所以只能自己動手,在這裡簡單說一下過程.首先既然redisTemplate依賴jedis,那我們可以認為他內部操作的就是jedis,同理,我們也可以認為他內部也能操作jedisCluster.接下來就在spring-data-redis的原始碼裡面搜一下jedisCluster這個字串,發現JedisClusterConnection和JedisConnectionFactory中出現了jedisCluster,有沒有覺得JedisConnectionFactory很眼熟呢,對,就是配置檔案中redisTemplate初始化時候需要用到的連線工廠.現在就可以直接看JedisConnectionFactory 首先,我們來看JedisConnectionFactory,發現裡面有一個屬性就是jedisCluster,那就看看jedisCluster是如何被初始化的,看下圖:我們可以先看這個方法,這個方法是從InitializingBean中實現的方法,是spring初始化bean的時候需要呼叫的.所以可以假裝認為只要例項化了JedisConnectionFactory就可以例項化jedisCluster,但是不要忘了有一個條件,那就是clusterConfig不能為空,接下來我們找clusterConfig是如何被例項化的.發現JedisConnectionFactory有一個建構函式
JedisConnectionFactory(RedisClusterConfiguration clusterConfig, JedisPoolConfig poolConfig).這下就好辦了JedisPoolConfig我們本來就認識,RedisClusterConfiguration是需要我們例項化的,接下來就看看RedisClusterConfiguration,一進來RedisClusterConfiguration我們就能看到個好東西,見下圖:
我們可以看RedisClusterConfiguration的註釋,雖然沒有說明,但是光看格式,就大概能猜到這些東西應該是寫到properties檔案裡面的,而建構函式的引數又正好是propertySource,很容易就能聯想到ResourcePropertySource,接下來就簡單了,直接開始開幹了.
2:redisClusterConfig配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<!-- 引入配置檔案 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:redis.properties" />
</bean>
<!-- jedis 配置-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig" >
<!--最大空閒數-->
<property name="maxIdle" value="${redis.maxIdle}" />
<!--最大建立連線等待時間-->
<property name="maxWaitMillis" value="${redis.maxWait}" />
<!--是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個-->
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean >
<!--配置檔案載入-->
<bean id="resourcePropertySource" class="org.springframework.core.io.support.ResourcePropertySource">
<constructor-arg name="name" value="redis.properties"/>
<constructor-arg name="resource" value="classpath:redis.properties"/>
</bean>
<!--redisCluster配置-->
<bean id="redisClusterConfiguration" class="org.springframework.data.redis.connection.RedisClusterConfiguration">
<constructor-arg name="propertySource" ref="resourcePropertySource"/>
</bean>
<!-- redis伺服器中心 -->
<bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
<constructor-arg name="clusterConfig" ref="redisClusterConfiguration"/>
<constructor-arg name="poolConfig" ref="poolConfig"/>
<property name="password" value="${redis.password}" />
<property name="timeout" value="${redis.timeout}" ></property>
</bean >
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
<property name="connectionFactory" ref="connectionFactory" />
<!--如果不配置Serializer,那麼儲存的時候預設使用String,如果用User型別儲存,那麼會提示錯誤User can't cast to String!! -->
<property name="keySerializer" >
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer" >
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
</property>
</bean >
<bean id="redisHttpSessionConfiguration"
class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
<!--超時時間,預設1800秒-->
<property name="maxInactiveIntervalInSeconds" value="1800" />
</bean>
</beans>
3:redis.properties配置檔案
#redis中心
#redis的伺服器地址
redis.host=127.0.0.1
#redis的服務埠
redis.port=6379
#密碼
redis.password=
#最大空閒數
redis.maxIdle=100
#最大連線數
redis.maxActive=300
#最大建立連線等待時間
redis.maxWait=1000
#客戶端超時時間單位是毫秒
redis.timeout=100000
redis.maxTotal=1000
redis.minIdle=8
#明是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個
redis.testOnBorrow=true
#sentinel
spring.redis.sentinel.master=mymaster
spring.redis.sentinel.node1.host=127.0.0.1
spring.redis.sentinel.node2.host=127.0.0.1
spring.redis.sentinel.node3.host=127.0.0.1
spring.redis.sentinel.node1.port=26379
spring.redis.sentinel.node2.port=26479
spring.redis.sentinel.node3.port=26579
#sentinel
#jediscluster
cluster1.host.port=127.0.0.1:7000
cluster2.host.port=127.0.0.1:7001
cluster3.host.port=127.0.0.1:7002
cluster4.host.port=127.0.0.1:7003
cluster5.host.port=127.0.0.1:7004
cluster6.host.port=127.0.0.1:7005
cluster7.host.port=127.0.0.1:7006
cluster8.host.port=127.0.0.1:7007
#jediscluster
#rediscluster
spring.redis.cluster.nodes=127.0.0.1:7000,127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006,127.0.0.1:7007
spring.redis.cluster.max-redirects=3
#rediscluster