您的位置:首页 > 数据库 > Redis

客户端分片使用ShardedJedisPool,设置DB和超时时间

2015-08-18 14:47 996 查看
在使用jedis(2.7.2)做redis 客户端Sharding的时候,发现ShardedJedisPool里没有设置DB和超时时间的地方,看了JedisShardInfo的源码,里面的构造方法要么只能设置超时时间,要么只能设置DB,没有同时设置这两个的方法。 

public JedisShardInfo(String host) {
super(Sharded.DEFAULT_WEIGHT);
URI uri = URI.create(host);
if (JedisURIHelper.isValid(uri)) {
this.host = uri.getHost();
this.port = uri.getPort();
this.password = JedisURIHelper.getPassword(uri);
this.db = JedisURIHelper.getDBIndex(uri);
} else {
this.host = host;
this.port = Protocol.DEFAULT_PORT;
}
}

public JedisShardInfo(String host, int port, int connectionTimeout, int soTimeout, int weight) {
super(weight);
this.host = host;
this.port = port;
this.connectionTimeout = connectionTimeout;
this.soTimeout = soTimeout;
}


看起来只能自己继承JedisShardInfo来实现以上的功能,代码也比较简单

代码如下

/**
* 重写JedisShardInfo
*
*/
public class MyJedisShardInfo extends JedisShardInfo{

public MyJedisShardInfo(String host, int connectionTimeout, int soTimeout) {

super(host);
// 设置超时时间
this.setConnectionTimeout(connectionTimeout);
this.setSoTimeout(soTimeout);
}

}


然后在spring配置文件中使用自定义的JedisShardInfo,如下

<!-- redis sharding -->
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<bean name="redis1" class="com.my.cache.MyJedisShardInfo">
<constructor-arg index="0" value="${redis.slaver1.host}" />
<constructor-arg index="1" value="${redis.client.connectionTimeout}" />
<constructor-arg index="2" value="${redis.client.soTimeout}" />
</bean>
<bean name="redis2" class="com.my.cache.MyJedisShardInfo">
<constructor-arg index="0" value="${redis.slaver2.host}" />
<constructor-arg index="1" value="${redis.client.connectionTimeout}" />
<constructor-arg index="2" value="${redis.client.soTimeout}" />
</bean>
</list>
</constructor-arg>
</bean>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.pool.maxTotal}" />
<property name="maxIdle" value="${redis.pool.maxIdle}" />
<property name="timeBetweenEvictionRunsMillis" value="${redis.pool.timeBetweenEvictionRunsMillis}" />
<property name="minEvictableIdleTimeMillis" value="${redis.pool.minEvictableIdleTimeMillis}" />
<property name="softMinEvictableIdleTimeMillis" value="${redis.pool.softMinEvictableIdleTimeMillis}" />
<property name="maxWaitMillis" value="${redis.pool.maxWaitMillis}" />
<property name="testOnBorrow" value="${redis.pool.testOnBorrow}" />
<property name="testWhileIdle" value="${redis.pool.testWhileIdle}" />
<property name="testOnReturn" value="${redis.pool.testOnReturn}" />
<property name="blockWhenExhausted" value="${redis.pool.blockWhenExhausted}" />
</bean>


properties文件中配置如下

#redis cluster
#Scheme://username:password@IP:PORT/dbindex
redis.slaver1.host=http://10.10.10.134:6379/0
redis.slaver2.host=http://10.10.10.134:6380/0
redis.client.connectionTimeout=2000
redis.client.soTimeout=2000

#redis pool
redis.pool.maxTotal=100
redis.pool.maxIdle=30
redis.pool.timeBetweenEvictionRunsMillis=30000
redis.pool.minEvictableIdleTimeMillis=1800000
redis.pool.softMinEvictableIdleTimeMillis=1800000
redis.pool.maxWaitMillis=1500
redis.pool.testOnBorrow=true
redis.pool.testWhileIdle=false
redis.pool.testOnReturn=false
redis.pool.blockWhenExhausted=false


这样在代码中直接使用

    @Resource(name = "shardedJedisPool")

    private ShardedJedisPool pool;

即可使用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis sharding jedis