1. 程式人生 > >Spring整合redis叢集

Spring整合redis叢集

目錄

1,說明

6,使用

1,說明

本文使用的客戶端為jedisCluster.它已經封裝了一些常用操作。故只需根據自己需要再進行封裝即可。

2,jar版本

使用的jar包的版本如下

jedis-2.9.0.jar(據網上反饋,只有這個版本的客戶端,支援訪問帶密碼的redis叢集)

spring-data-commons-1.8.6.RELEASE.jar

spring-data-redis-1.8.6.RELEASE.jar

由於專案比較古老,所以,spring主版本用的還是 3.2.6的。

jar的下載地址:傳送門

3,清理jar

將上述包下載並匯入工程後,注意刪除對應老版本的的jar,避免出現衝突。

4,redis.properties檔案

在conf下新建一個資料夾,起名redis.並新建redis.properties檔案,輸入如下內容:

redisCluster.maxIdle=10000
redisCluster.maxWaitMillis=50000
redisCluster.testOnBorrow=true

redisCluster.host1Ip=ip1
redisCluster.host2Ip=ip2
redisCluster.port1=port1
redisCluster.port2=port2
redisCluster.port3=port3

redisCluster.connectionTimeout=60000
redisCluster.soTimeout=30000
redisCluster.maxAttempts=3
redisCluster.password=pwd123

5,applicationContext.xml配置

在applicationContext.xml中,輸入如下資訊

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<!--最大空閒數 -->
		<property name="maxIdle" value="${redisCluster.maxIdle}" />
		<!--最大建立連線等待時間 -->
		<property name="maxWaitMillis" value="${redisCluster.maxWaitMillis}" />
		<!--是否在從池中取出連線前進行檢驗,如果檢驗失敗,則從池中去除連線並嘗試取出另一個 -->
		<property name="testOnBorrow" value="${redisCluster.testOnBorrow}" />
	</bean>
    
    <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
    	<constructor-arg>
    		<set>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="${redisCluster.host1Ip}"/>
					<constructor-arg name="port" value="${redisCluster.port1}"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="${redisCluster.host1Ip}"/>
					<constructor-arg name="port" value="${redisCluster.port2}"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="${redisCluster.host1Ip}"/>
					<constructor-arg name="port" value="${redisCluster.port3}"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="${redisCluster.host2Ip}"/>
					<constructor-arg name="port" value="${redisCluster.port1}"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="${redisCluster.host2Ip}"/>
					<constructor-arg name="port" value="${redisCluster.port2}"/>
    			</bean>
    			<bean class="redis.clients.jedis.HostAndPort">
    				<constructor-arg name="host" value="${redisCluster.host2Ip}"/>
					<constructor-arg name="port" value="${redisCluster.port3}"/>
    			</bean>
    		</set>
    	</constructor-arg>
    	<constructor-arg name="connectionTimeout" value="${redisCluster.connectionTimeout}" />
	    <constructor-arg name="soTimeout" value="${redisCluster.soTimeout}" />
	    <constructor-arg name="maxAttempts" value="${redisCluster.maxAttempts}" />
	    <constructor-arg name="password" value="${redisCluster.password}" />
	    <constructor-arg name="poolConfig">
	        <ref bean="jedisPoolConfig" />
	    </constructor-arg>
	</bean>

至此,配置部分結束。

注意:properties檔案要通過配置載入進來。參考applicationContext.xml中其他properties檔案的載入方式,載入進來。

由於spring管理預設是單例的,所以,同一個類,只能生成一個例項物件。所以,要看其中的properties的載入類。或者可以利用set標籤,批量載入properties檔案

如下所示

    <bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:conf/jdbc.properties</value>
				<value>classpath:conf/redis/redis.properties</value>
			</list>
		</property>
		<!-- 新增如下屬性,可以避免讀取多個properties檔案報錯 -->
		<property name="ignoreUnresolvablePlaceholders" value="true" />
	</bean>

6,使用

使用

@Autowired protected JedisCluster jedisCluster;

自動注入物件。

7,寫入和讀入

注意要序列化鍵和值。這樣redis中就可以儲存物件

寫入示例程式碼:

public void save(final String key, final Object value, final long  expirTime) {
		try {
			String keySerialize = 序列化(key);
			String valueSerialize = 序列化(value);
			
			jedisCluster.lpush(keySerialize.getBytes(), valueSerialize.getBytes());
			jedisCluster.expireAt(keySerialize.getBytes(),(expirTime+(new Date()).getTime()));
			
		} catch (IOException e) {
			e.printStackTrace();
			throw new RuntimeException("序列化失敗!", e);
		}
	}

讀取的示例程式碼如下

public Object get(final String id) {
		//1,序列化key
		try {
			byte[] key =序列化(id).getBytes();
			byte[] lindex = jedisCluster.lindex(key, 0L);
			if(null != lindex){
				String valueSerialize =new String(lindex,"UTF-8");
				Object result = 反序列化(valueSerialize);
				return result;
			}else{
				return null;
			}
		} catch (Exception e1) {
			e1.printStackTrace();
			// TODO Auto-generated catch block
			return null;
		}
	}

其中

jedisCluster.expireAt(keySerialize.getBytes(),(expirTime+(new Date()).getTime()));

這個標識 失效時間,是以unix時間戳為標識的。換言之,就是到某個具體的時間點時,key值失效

筆者在這裡耽誤了一天的時間。唉。。。。