1. 程式人生 > >Redis RedisCluster Spring整合

Redis RedisCluster Spring整合

前言:

在上一篇文章中,用了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

4:直接注入就可以使用,測試通過