目录
1,说明
本文使用的客户端为jedisCluster.它已经封装了一些常用操作。故只需根据自己需要再进行封装即可。
2,jar版本
使用的jar包的版本如下
jedis-2.9.0.jar(据网上反馈,只有这个版本的客户端,支持访问带密码的redis集群)
spring-data-commons-1.8.6.RELEASE.jar
spring-data-redis-1.8.6.RELEASE.jar
由于项目比较古老,所以,spring主版本用的还是 3.2.6的。
jar的下载地址:传送门
3,清理jar
将上述包下载并导入工程后,注意删除对应老版本的的jar,避免出现冲突。
4,redis.properties文件
在conf下新建一个文件夹,起名redis.并新建redis.properties文件,输入如下内容:
redisCluster.maxIdle=10000
redisCluster.maxWaitMillis=50000
redisCluster.testOnBorrow=true
redisCluster.host1Ip=ip1
redisCluster.host2Ip=ip2
redisCluster.port1=port1
redisCluster.port2=port2
redisCluster.port3=port3
redisCluster.connectionTimeout=60000
redisCluster.soTimeout=30000
redisCluster.maxAttempts=3
redisCluster.password=pwd123
5,applicationContext.xml配置
在applicationContext.xml中,输入如下信息
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!--最大空闲数 -->
<property name="maxIdle" value="${redisCluster.maxIdle}" />
<!--最大建立连接等待时间 -->
<property name="maxWaitMillis" value="${redisCluster.maxWaitMillis}" />
<!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 -->
<property name="testOnBorrow" value="${redisCluster.testOnBorrow}" />
</bean>
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redisCluster.host1Ip}"/>
<constructor-arg name="port" value="${redisCluster.port1}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redisCluster.host1Ip}"/>
<constructor-arg name="port" value="${redisCluster.port2}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redisCluster.host1Ip}"/>
<constructor-arg name="port" value="${redisCluster.port3}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redisCluster.host2Ip}"/>
<constructor-arg name="port" value="${redisCluster.port1}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redisCluster.host2Ip}"/>
<constructor-arg name="port" value="${redisCluster.port2}"/>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="${redisCluster.host2Ip}"/>
<constructor-arg name="port" value="${redisCluster.port3}"/>
</bean>
</set>
</constructor-arg>
<constructor-arg name="connectionTimeout" value="${redisCluster.connectionTimeout}" />
<constructor-arg name="soTimeout" value="${redisCluster.soTimeout}" />
<constructor-arg name="maxAttempts" value="${redisCluster.maxAttempts}" />
<constructor-arg name="password" value="${redisCluster.password}" />
<constructor-arg name="poolConfig">
<ref bean="jedisPoolConfig" />
</constructor-arg>
</bean>
至此,配置部分结束。
注意:properties文件要通过配置加载进来。参考applicationContext.xml中其他properties文件的加载方式,加载进来。
由于spring管理默认是单例的,所以,同一个类,只能生成一个实例对象。所以,要看其中的properties的加载类。或者可以利用set标签,批量加载properties文件
如下所示
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:conf/jdbc.properties</value>
<value>classpath:conf/redis/redis.properties</value>
</list>
</property>
<!-- 添加如下属性,可以避免读取多个properties文件报错 -->
<property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
6,使用
使用
@Autowired
protected JedisCluster jedisCluster;
自动注入对象。
7,写入和读入
注意要序列化键和值。这样redis中就可以存储对象
写入示例代码:
public void save(final String key, final Object value, final long expirTime) {
try {
String keySerialize = 序列化(key);
String valueSerialize = 序列化(value);
jedisCluster.lpush(keySerialize.getBytes(), valueSerialize.getBytes());
jedisCluster.expireAt(keySerialize.getBytes(),(expirTime+(new Date()).getTime()));
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("序列化失败!", e);
}
}
读取的示例代码如下
public Object get(final String id) {
//1,序列化key
try {
byte[] key =序列化(id).getBytes();
byte[] lindex = jedisCluster.lindex(key, 0L);
if(null != lindex){
String valueSerialize =new String(lindex,"UTF-8");
Object result = 反序列化(valueSerialize);
return result;
}else{
return null;
}
} catch (Exception e1) {
e1.printStackTrace();
// TODO Auto-generated catch block
return null;
}
}
其中
jedisCluster.expireAt(keySerialize.getBytes(),(expirTime+(new Date()).getTime()));
这个标识 失效时间,是以unix时间戳为标识的。换言之,就是到某个具体的时间点时,key值失效。
笔者在这里耽误了一天的时间。唉。。。。