Spring集成redis集群

目录

 

1,说明

2,jar版本

3,清理jar

4,redis.properties文件

5,applicationContext.xml配置

6,使用

7,写入和读入


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值失效

笔者在这里耽误了一天的时间。唉。。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值