针对JedisShardInfo中无法修改db的解决办法

时间:2022-03-04 14:35:08
package com.ldr.bean;

import java.lang.reflect.Field;

import redis.clients.jedis.JedisShardInfo;

public class MyJedisInfo {
    
    String host;
    int port;
    int db;

    public JedisShardInfo newInstance() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {  
        JedisShardInfo jedisShardInfo=new JedisShardInfo(host,port) ;
        Class<? extends JedisShardInfo> clz = jedisShardInfo.getClass();
        Field declaredField = clz.getDeclaredField("db");
        declaredField.setAccessible(true);
        declaredField.set(jedisShardInfo, db);
        return jedisShardInfo;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public int getDb() {
        return db;
    }

    public void setDb(int db) {
        this.db = db;
    }
    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }  
}

spring中的application.xml中配置如下

    
    <!-- spring集成redis -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal">
        <value>${redis.maxTotal}</value>
        </property>
        <property name="maxIdle">
         <value>${redis.maxIdle}</value>
        </property>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="true"/>
    </bean>
   
     <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool"  scope="singleton">
        <constructor-arg index="0" ref="jedisPoolConfig" />
        <constructor-arg index="1">
            <list>
                <!-- <bean class="redis.clients.jedis.JedisShardInfo">
                    <constructor-arg name="host" value="${redis.host}" />
                    <constructor-arg name="port" value="${redis.port}" />
                </bean> -->
          
                <ref bean="jedisShardInfo"/><!-- 生产环境请换成上述 -->
            </list>
        </constructor-arg>
    </bean>
    
    <!-- 以下配置上生产请注释掉  begin-->
    <bean id="jedisFactory" class="com.ldr.bean.MyJedisInfo">
        <property name="host" value="${redis.host}"></property>
        <property name="port" value="${redis.port}"></property>
        <property name="db" value="${redis.db}"></property>
    </bean>  
     
    <bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo"  
        factory-bean="jedisFactory" factory-method="newInstance" >  
    </bean> 
     <!-- 以上配置上生产请注释掉 end -->