Spring整合redis叢集
目錄
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值失效。
筆者在這裡耽誤了一天的時間。唉。。。。