首页 > 编程语言 > 详细

spring-data-redis操作redis cluster

时间:2016-01-21 23:40:33      阅读:598      评论:0      收藏:0      [点我收藏+]

     Redis 3.X版本引入了集群的新特性,为了保证所开发系统的高可用性项目组决定引用Redis的集群特性。对于Redis数据访问的支持,目前主要有二种方式:一、以直接调用jedis来实现;二、使用spring-data-redis,通过spring的封装来调用。下面分别对这二种方式如何操作Redis进行说明。

一、利用Jedis来实现

      通过Jedis操作Redis Cluster的模型可以参考Redis官网,具体如下:

        Set<HostAndPort>  jedisClusterNodes = new HashSet<HostAndPort>();

          //Jedis Cluster will attempt to discover cluster nodes automatically

         jedisClusterNodes.add(new HostAndPort("10.96.5.183",9001));

         jedisClusterNodes.add(new HostAndPort("10.96.5.183",9002));

         jedisClusterNodes.add(new HostAndPort("10.96.5.183",9003));

        JedisCluster jc = new JedisCluster(jedisClusterNodes);

        jc.set("foo","bar");

二、利用spring-data-redis来实现

      目前spring-data-redis已发布的主干版本都不能很好的支持Redis Cluster的新特性。为了解决此问题spring-data-redis开源项目组单独拉了一个315分支,但截止到目前尚未发布。下面在分析spring-data-redis源码的基础上配置spring实现操作Redis Cluster.下面分别针对XML和注入的方式进行说明。

(1)Spring XML配置

     代码目录结构如下所示:

          com.example.bean

          com.example.repo

          com.example.repo.impl

          resources

    A.在resources目录下增加spring-config.xml配置,配置如下:

     <bean id="clusterRedisNodes1"   class="org.springframework.data.redis.connection.RedisNode">  <!--通过构造方法注入RedisNode-->

            <constructor-arg index="0"  type="String">

                 <value>10.96.5.183</value>

          </constructor-arg>

          <constructor-arg index="1"  type="int">

                 <value>9001</value>

          </constructor-arg>

     </bean>

     ....

    <bean id="redisClusterConfiguration"   class="org.springframework.data.redis.connection.RedisClusterConfiguration">

       <property name="clusterNodes"> <!--setter方式注入-->

              <set>

                        <ref bean="clusterRedisNodes1"/>

                       <ref bean="clusterRedisNodes2"/>

                       <ref bean="clusterRedisNodes3"/>

              </set>

       </property>

     <!--红色所示部分在从gitHub上获取的jar包中无对应setter方法,因此需要修改其对应的源码。

         另外,如果不设置clusterTimeOut值,源码中默认为2S。当集群服务器与客户端不在同一服务器上时,容易报:Could not get a resource from the Cluster;

                   如果不设置maxRedirects值,源码中默认为5。一般当此值设置过大时,容易报:Too many Cluster redirections -->

        <property name="clusterTimeOut"  value="10000" />

        <property name="maxRedirects"   value="5" />

    </bean>

   <bean id="jedisPoolConfig"   class="redis.clients.jedis.JedisPoolConfig">

            <property name="maxToal" value="1000" />

           <property name="maxIdle" value="1000" />

           <property name="maxWaitMillis" value="1000" />

   </bean>

  <bean id="jedisConnFactory"   class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true">

           <constructor-arg ref="redisClusterConfiguration" />

           <constructor-arg ref="jedisPoolConfig" />

  </bean>

 <bean id="redisTemplate"   class="org.springframework.data.redis.core.RedisTemplate"

             p:connection-factory-ref="jedisConnFactory" />

<bean id="personRepo"  class="com.example.repo.impl.PersonRepoImpl">

       <property name="redisTemplate" ref="redisTemplate" />

</bean>

在com.example.repo.impl下增加PersonRepoImpl,主要包括属性private RedisTemplate<String,Bean>  redisTemplate;

利用redisTemplate.opsForHash().put()即可完成对Redis Cluster的操作。

 ClassPathXmlApplicationContext  context = new ClassPathXmlApplicationContext(new ClassPathResource("resources/spring-config.xml").getPath());

 Repo repo =(Repo)context.getBean("personRepo");

(2)Spring注解

三、Redis Cluster调试中常见错误

(1)当客户端与集群服务器不在同一台服务器上时,有如下错误Could not get a resource from the Cluster

    一般当客户端与集群服务器在同一台服务器上时,操作Redis Cluster正常; 当二者不在同一台服务器上时报如上错误,可能是clusterTimeOut时间设置过小;

(2)操作Redis时报Too many cluster redirections

    初始化JedisCluster时,设定JedisCluster的maxRedirections.

   JedisCluster(Set<HostAndPort> jedisClusterNode, int timeout, int maxRedirections) ;
   JedisCluster jc = new JedisCluster(jedisClusterNodes,5000,1000);

(3)Redis Cluster数据写入慢

   检查在通过./redis-trib命令建立集群时,如果是通过127.0.0.1的方式建立的集群,那么在往Redis Cluster中写入数据时写入速度比较慢。可以通过配置真实的IP来规避此问题。

spring-data-redis操作redis cluster

原文:http://www.cnblogs.com/moonandstar08/p/5149585.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!