spring-redis配置
1. applicationContext-redis.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 定义受环境影响易变的变量 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="ignoreResourceNotFound" value="true" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:redis-config.properties</value>
</list>
</property>
</bean>
<!-- 公共POOL配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="1024" />
<property name="maxIdle" value="8" /><!-- 最大空闲连接数, 默认8个 -->
<property name="maxWaitMillis" value="15000"/><!-- 获取连接时的最大等待毫秒数 -->
<property name="testOnBorrow" value="true" /><!-- 在获取连接的时候检查有效性, 默认false -->
<property name="testWhileIdle" value="false"/><!-- 空闲是否检查是否有效,默认为false -->
<property name="testOnReturn" value="true"/>
</bean>
<!-- jedis shard信息配置 -->
<bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="192.168.1.204" />
<constructor-arg index="1" value="6380" type="int"/>
<property name="password" value="123456" />
</bean>
<!-- jedis shard pool配置,提供给程序注入使用 -->
<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<ref bean="jedisShardInfo" />
</list>
</constructor-arg>
</bean>
</beans>
2. 通过redis-config.properties文件注入
applicationContext-redis.xml相应地方更改为
<!-- jedis shard信息配置 -->
<bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" value="${redis.ip}" />
<constructor-arg index="1" value="${redis.port}" type="int"/>
<property name="password" value="${redis.password}" />
</bean>
redis-config.properties文件:
redis.ip=192.168.1.204
redis.password=123456
redis.port=6379
注意:如果适用默认端口6379,使用自定义端口6380,如果不指定类型,构造时始终调用两个字符串的构造函数,所以当出现端口更改时,程序还是调用原来的构造函数. 故必须指定参数类型为int
<constructor-arg index="1" value="6380" type="int"/>
3. 高级uri注入,可选择db
<!-- jedis uri信息配置 -->
<bean id="uri" class="java.net.URI">
<!-- jedis URI配置 redis://redis:password@ip:port/database -->
<constructor-arg index="0" value="redis://redis:123456@192.168.1.203:6379/2" />
</bean>
<bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" ref="uri" />
</bean>
这个注入方法比较高级,可以选择Redis DB 可以选择相应的db(redis默认db=0),目前redis.clients.jedis.JedisShardInfo类中没有提供直接改变db的构造方法或者属性注入,个人认为这是目前改变db最快捷的方法;当然也有其他方法,比如自己重写当前类等
我还碰到一个更奇葩的问题,密码中存在“/”,导致不能正确读取到db,原因各位请看源码便知
解决方法:
<!-- jedis uri信息配置 -->
<bean id="uri" class="java.net.URI">
<!-- jedis URI配置 redis://redis:password@ip:port/database -->
<constructor-arg index="0" value="redis://redis:123456@192.168.1.203:6379/2" />
</bean>
<bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo">
<constructor-arg index="0" ref="uri" />
<property name="password" value="123/456" />
</bean>
PS:spring注入是先方法再属性,所以此方法可行!
4. 最后附上redis.clients.jedis.JedisShardInfo源码:
package redis.clients.jedis;
import java.net.URI;
import redis.clients.jedis.exceptions.InvalidURIException;
import redis.clients.util.JedisURIHelper;
import redis.clients.util.ShardInfo;
import redis.clients.util.Sharded;
public class JedisShardInfo extends ShardInfo<Jedis> {
public String toString() {
return host + ":" + port + "*" + getWeight();
}
private int connectionTimeout;
private int soTimeout;
private String host;
private int port;
private String password = null;
private String name = null;
// Default Redis DB
private int db = 0;
public String getHost() {
return host;
}
public int getPort() {
return port;
}
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, String name) {
this(host, Protocol.DEFAULT_PORT, name);
}
public JedisShardInfo(String host, int port) {
this(host, port, 2000);
}
public JedisShardInfo(String host, int port, String name) {
this(host, port, 2000, name);
}
public JedisShardInfo(String host, int port, int timeout) {
this(host, port, timeout, timeout, Sharded.DEFAULT_WEIGHT);
}
public JedisShardInfo(String host, int port, int timeout, String name) {
this(host, port, timeout, timeout, Sharded.DEFAULT_WEIGHT);
this.name = name;
}
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;
}
public JedisShardInfo(String host, String name, int port, int timeout, int weight) {
super(weight);
this.host = host;
this.name = name;
this.port = port;
this.connectionTimeout = timeout;
this.soTimeout = timeout;
}
public JedisShardInfo(URI uri) {
super(Sharded.DEFAULT_WEIGHT);
if (!JedisURIHelper.isValid(uri)) {
throw new InvalidURIException(String.format(
"Cannot open Redis connection due invalid URI. %s", uri.toString()));
}
this.host = uri.getHost();
this.port = uri.getPort();
this.password = JedisURIHelper.getPassword(uri);
this.db = JedisURIHelper.getDBIndex(uri);
}
public String getPassword() {
return password;
}
public void setPassword(String auth) {
this.password = auth;
}
public int getConnectionTimeout() {
return connectionTimeout;
}
public void setConnectionTimeout(int connectionTimeout) {
this.connectionTimeout = connectionTimeout;
}
public int getSoTimeout() {
return soTimeout;
}
public void setSoTimeout(int soTimeout) {
this.soTimeout = soTimeout;
}
public String getName() {
return name;
}
public int getDb() {
return db;
}
@Override
public Jedis createResource() {
return new Jedis(this);
}
}